我有一个数据框列表,每个数据框都有一个唯一的名称,可用于查找其组标识。我想通过组标识拆分此列表,平均每个组中的数据帧,并将其全部返回到由组重命名的数据帧列表中。下面的代码做了我想要的,但我觉得它使用了太多'ply'功能。必须有一个更简单/更快/更优雅的解决方案,而不是使用'plyr'抨击列表,直到它合并为止(bwahaha)。
l<-list(a.txt=data.frame(x=c(1,4), y=c(5,5)),
b.txt=data.frame(x=c(5,3), y=c(4,5)),
c.txt=data.frame(x=c(1,1), y=c(6,2)),
d.txt=data.frame(x=c(9,9), y=c(4,1)))
e<-data.frame(ID=c("a","b","c","d"), Grp=c("amb","amb","sam","sam"))
f<-unique(e$Grp)
new_l<-llply(seq_along(f), function(x,n,i){as.data.frame(
aaply(laply(x[paste(e$ID[e$Grp%in%n[i]],".txt", sep="")], as.matrix),
c(2,3), mean))}, x=l, n=f)
names(new_l)<-gids
如果已经回答这个问题,请指出正确的方向,因为我找不到它。
答案 0 :(得分:2)
通过Grp拆分ID,然后为每组ID获取l的相应组件并取其平均值。
Mean <- function(x) Reduce("+", x) / length(x)
tapply(e$ID, e$Grp, function(id) Mean(l[paste0(id, ".txt")]))
,并提供:
$amb
x y
1 3.0 4.5
2 3.5 5.0
$sam
x y
1 5 5.0
2 5 1.5
注意:如果已知ID与l的组件完全对齐,则可以进行简化,如问题所示。在这种情况下,可以在e $ Grp上分割l:
tapply(l, e$Grp, Mean)
答案 1 :(得分:1)
如果我正确理解您的问题,以下内容应该有效。这也假定您的e
数据框的顺序与您的l
数据框列表的顺序相同。否则,我可以编辑解决方案以满足您的需求。
res <- lapply(1:length(f),function(m) Reduce('+',l[e$Grp==f[m]])/length(l[e$Grp==f[m]]))
names(res) <- f
$amb
x y
1 3.0 4.5
2 3.5 5.0
$sam
x y
1 5 5.0
2 5 1.5