R 用户定义的函数,用于计算特定数据帧行的平均值并替换它们,应用于数据帧列表

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

我的问题实际上包含两个问题: 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            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 for
any(sappy(list_-df,nrow)==0)
我得到
FLASE
作为返回。