R 用户定义的函数,用于计算特定数据帧行的平均值并替换它们,应用于数据帧列表
我的问题实际上包含两个问题: 1.创建一个用户定义的函数,该函数将根据条件以其方式替换行 2.将其应用于数据帧列表 第一个问题: 例如,当我们有以下数据帧时:R 用户定义的函数,用于计算特定数据帧行的平均值并替换它们,应用于数据帧列表,r,R,我的问题实际上包含两个问题: 1.创建一个用户定义的函数,该函数将根据条件以其方式替换行 2.将其应用于数据帧列表 第一个问题: 例如,当我们有以下数据帧时: Year Measurement1 Measurement2 2010 5 6 2011 4 2 2011 6 4 2011 2 1 2012 1 4 2012 5 10 2013 6
Year Measurement1 Measurement2
2010 5 6
2011 4 2
2011 6 4
2011 2 1
2012 1 4
2012 5 10
2013 6 1
Year Measurement1 Measurement2
2010 5 6
2011 6 3.5
2012 3 7
2013 6 1
我想创建一个用户定义的函数,该函数计算具有相同年份(条件)的行的平均值,并将具有相同年份的行替换为具有计算平均值的行。
(不幸的是,我每年没有相同数量的行。)
对于数据帧:
Year Measurement1 Measurement2
2010 5 6
2011 4 2
2011 6 4
2011 2 1
2012 1 4
2012 5 10
2013 6 1
Year Measurement1 Measurement2
2010 5 6
2011 6 3.5
2012 3 7
2013 6 1
第二个问题:
如果有一种方法可以创建这样一个用户定义的函数,我如何将其应用于数据帧列表,例如使用
dfs = Filter(function(x) is(x, "data.frame"), mget(ls()))
我真的很感激任何帮助!
提前谢谢你 对于第一个问题,请使用
数据。表
:
library(data.table)
dt <- as.data.table(YourData)
dt[,.(Measurement1_mean=mean(Measurement1), Measurement2_mean=mean(Measurement2)),by=Year]
库(data.table)
dt正如Cettt所提到的,您可以使用dplyr
df%>%
组别(年份)%>%
总结(平均值1=平均值(M1),平均值2=平均值(M2))
#一个tibble:4x3
年份平均数1平均数2
1 2010 5 6
2 2011 4 2.33
3 2012 3 7
4 2013 6 1
以下是如何使用基本R聚合将其应用于一个数据帧
aggregate(cbind(Measurement1, Measurement2)~Year, df, mean)
# Year Measurement1 Measurement2
#1 2010 5 6.000
#2 2011 4 2.333
#3 2012 3 7.000
#4 2013 6 1.000
现在,假设您希望将此应用于数据帧列表(例如list\u df
),您可以使用lappy
lapply(list_df, function(df) aggregate(cbind(Measurement1, Measurement2)~Year, df, mean))
如果有多个列要聚合
,我们可以创建一个公式
对象
Names <- c("Measurement1", "Measurement2")
aggregate(formula(paste0("cbind(", paste(Names, collapse = " , "), ")~Year")), df, mean)
# Year Measurement1 Measurement2
#1 2010 5 6.000000000
#2 2011 4 2.333333333
#3 2012 3 7.000000000
#4 2013 6 1.000000000
Names对于base R
,除了@Ronak Shah提供的aggreate()
解决方案之外,您还可以使用ave
和unique()
使其:
unique(with(df,
data.frame(
Year = Year,
Measurement1=ave(Measurement1,Year),
Measurement2=ave(Measurement2,Year))))
其中:
Year Measurement1 Measurement2
1 2010 5 6.000000
2 2011 4 2.333333
5 2012 3 7.000000
7 2013 6 1.000000
查看dplyr
软件包。特别是你想看看group\u by
和summary
。谢谢你的解决方案:)我实际上有72列要执行这项任务。因此,我创建了一个带有姓名(“字符”)的列表Names
,并以以下方式在输入中输入:aggregate(cbind(get(Names))~Year,df,mean)
不幸的是,这使我在Year列旁边又多了一列作为输出。@Mcgroger我们可以用它创建一个公式对象。查看我的更新答案。这给了我以下错误:聚合.data.frame(lhs,mf[-1L],FUN=FUN,…):没有要聚合的行
,因此它似乎确实计算了平均值,但不知道将其放入哪一行。@Mcgroger这意味着列表中的某些数据帧有0行。你能检查一下any(sappy(list_-df,nrow)==0)
的输出吗?@Ronak Shah forany(sappy(list_-df,nrow)==0)
我得到FLASE
作为返回。