我有一个包含两列的数据框,看起来像
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在行值向量中但无效。
任何帮助都会受到赞赏,希望这是有道理的吗?我正在努力解决如何解决问题。
答案 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