如果我在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
}
但我相信一定有更优雅的方式吗?
答案 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"))