【问题标题】:Summing up combinations of column values汇总列值的组合
【发布时间】:2018-04-19 04:56:18
【问题描述】:

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

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_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_id 在行值向量中但无济于事。

任何帮助将不胜感激,希望这有意义吗?除了遇到问题之外,我还在纠结如何表述问题。

【问题讨论】:

    标签: r for-loop combinations


    【解决方案1】:

    我们可以使用lapply 并循环遍历richness 的每一行,然后一次创建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
    

    【讨论】:

      猜你喜欢
      • 2016-01-08
      • 1970-01-01
      • 2022-01-12
      • 2017-09-07
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多