按组拆分数据框列表,应用功能,组合成列表

split list of data frames by group, apply function, combine into list

我有一个数据框列表,每个数据框都有一个唯一的名称,可用于查找其组标识。我想按组身份拆分此列表,对每个组中的数据帧进行平均,然后 return 将其全部放入按组重命名的数据帧列表中。下面的代码做了我想要的,但我觉得它使用了太多 'ply' 函数。必须有一个更简单/更快/更优雅的解决方案,而不是用 'plyr' 抨击列表直到它 comPLYes (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                      

如果有人回答了这个问题,请指出正确的方向,因为我找不到它。

如果我正确理解您的问题,则以下内容应该有效。这还假设您的 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

按 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)