R数据帧列表的平均值

时间:2015-10-19 15:33:25

标签: r

如果我在R中有一个数据框列表,例如:

x<-c(1:10)
y<-2*x
z<-3*x
df.list <- list(data.frame(x),data.frame(y),data.frame(z))

我想平均所有这些数据框的特定列(这是一个简化的例子),有没有简单的方法呢?

列表的长度是已知的但是动态的(即它可以根据运行条件而改变)。

例如:

dfone<-data.frame(c(1:10))
dftwo<-data.frame(c(11:20))
dfthree<-data.frame(c(21:30))

(假设所有列名都是val

row, output
1,    (1+11+21)/3 = 11
2,    (2+12+22)/3 = 12
3,    (3+13+23)/3 = 13

所以output[i,1] = (dfone[i,1]+dftwo[i,1]+dfthree[i,1])/3

在for循环中执行此操作将是微不足道的:

for (i in 1:length(dfone))
{
  dfoutput[i,'value']=(dfone[i,'value']+dftwo[i,'value']+dfthree[i,'value'])/3
}

但我相信一定有更优雅的方式吗?

1 个答案:

答案 0 :(得分:1)

在问题变成其他问题之后编辑。这是否回答了你的问题?

dfs <- list(dfone, dftwo, dfthree)

#oneliner
res <- rowMeans(sapply(dfs,function(x){
  return(x[,"val"])
}))

#in steps

#step one: extract wanted column from all data
#this returns a matrix with one val-column for each df in the list
step1 <- sapply(dfs,function(x){
  return(x[,"val"])
})

#step two: calculate the rowmeans. this is self-explanatory
step2 <- rowMeans(step1)


#or an even shorter oneliner with thanks to@davidarenburg:

rowMeans(sapply(dfs, `[[`, "value"))