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

时间:2015-12-12 02:48:20

标签: r dataframe plyr data-manipulation

我有一个数据框列表,每个数据框都有一个唯一的名称,可用于查找其组标识。我想通过组标识拆分此列表,平均每个组中的数据帧,并将其全部返回到由组重命名的数据帧列表中。下面的代码做了我想要的,但我觉得它使用了太多'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                      

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

2 个答案:

答案 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