【问题标题】:split list of data frames by group, apply function, combine into list按组拆分数据帧列表,应用函数,合并到列表中
【发布时间】:2015-12-12 02:48:19
【问题描述】:

我有一个数据框列表,每个数据框都有一个唯一的名称,可用于查找其组标识。我想按组身份拆分此列表,平均每个组中的数据帧,并将其全部返回到按组重命名的数据帧列表中。以下代码可以满足我的要求,但我觉得它使用了太多的“层”功能。必须有一个更简单/更快/更优雅的解决方案,而不是用 '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                      

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

【问题讨论】:

    标签: r dataframe plyr data-manipulation


    【解决方案1】:

    通过 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)
    

    【讨论】:

    • 我同意,我想错了。需要拆分的是样本 id
    • 添加注释以回答。
    • 在这种情况下这可行,但我不想假设非玩具应用程序也是如此。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2021-07-22
      • 2022-01-07
      相关资源
      最近更新 更多