代码之家  ›  专栏  ›  技术社区  ›  Ally D

汇总列值的组合

  •  3
  • Ally D  · 技术社区  · 6 年前

    我有一个包含两列的数据框

    richness<- data.frame ("replicate_id"=c("1", "9", "10"), 
                           "richness"= c(3, 2, 4))
    

    我试图得到一个结果,在这里我有 replicate_id 以及 richness 与相关的副本

    [1] - 3
    
    [9] - 2
    
    [10] - 4
    
    [1+9] - 5
    
    [1+10] - 7
    
    [9+10] - 6
    
    [1+9+10] - 9
    

    最终,我不在乎 replicate\u id 并且希望得到的输出类似于:

    output<- data.frame ("n.replicates"=c("1", "1", "1", "2", "2", "2", "3"), 
                           "richness"= c(3, 2, 4, 5, 7, 6, 9))
    

    我在一个嵌套的for循环中有这个,因为我有好几天的相同数据。注意:这意味着复制ID的长度每天都在变化(在本例中,我只有三个,但这取决于它们的大小)。我似乎已经试过无数次了。这是我用来获得组合的:

    library(gtools)
    for (i in 1:length(richness$replicate_id)){
      combs <-  data.frame(combinations (length(richness$replicate_id), i, richness$replicate_id))}
    

    但之后我尝试的一切都是半身像,我尝试创建一个行值向量,然后总结replicate\u id是否在行值向量中,但没有结果。

    任何帮助都将不胜感激,希望这有意义?除了遇到问题之外,我还在努力学习如何表达这个问题。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ronak Shah    6 年前

    我们可以使用 lapply 并在每行上循环 richness 然后创建 丰富性 x 每次。然后我们创建该组合的数据帧 rbind 他们在一起。

    do.call("rbind", lapply(seq_along(richness$replicate_id), function(x) {
       temp = combn(richness$richness, x)
       data.frame(n.replicate = x, richness = colSums(temp))
     }))
    
    
    #  n.replicate richness
    #1           1        3
    #2           1        2
    #3           1        4
    #4           2        5
    #5           2        7
    #6           2        6
    #7           3        9
    

    中间步骤没有 do.call 参数返回

    lapply(seq_along(richness$replicate_id), function(x) {
      temp = combn(richness$richness, x)
      data.frame(n.replicate = x, richness = colSums(temp))
     })
    
    #   [[1]]
    #  n.replicate richness
    #1           1        3
    #2           1        2
    #3           1        4
    
    #[[2]]
    #  n.replicate richness
    #1           2        5
    #2           2        7
    #3           2        6
    
    #[[3]]
    #  n.replicate richness
    #1           3        9