总结列值的组合

时间:2018-04-19 04:56:19

标签: r for-loop combinations

我有一个包含两列的数据框,看起来像

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

我正在尝试获得一个结果,其中包含replicate_idrichness之和的所有组合以及相关的重复项

[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在行值向量中但无效。

任何帮助都会受到赞赏,希望这是有道理的吗?我正在努力解决如何解决问题。

1 个答案:

答案 0 :(得分:3)

我们可以使用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