当最终大小未知时,在 R 中替代 cbind 循环
Alternative in R to cbind loop when final size unknown
我需要为列表中的每个元素计算内部元素的所有组合,并存储所有组合(示例中的 b)。
我目前正在做我的例子,但对于更大的列表,它真的很慢,因为在循环中使用了 cbind。
因为我不知道我的向量 b 的最终总大小,所以我一开始无法分配对象。
我正在寻找其他替代方案以提高效率。
b=0
a = list(id1=c(1,2,3,4,5,6),id2=c(10,11,12))
for(i in 1:length(a)){
temp=combn(a[[i]],2)
b=cbind(b,temp)
}
这里是来自评论的 Arun 解决方案的替代方案,使用 purrr::map
data.frame(purrr::map(a, combn, 2))
# id1.1 id1.2 id1.3 id1.4 id1.5 id1.6 id1.7 id1.8 id1.9 id1.10 id1.11 id1.12
#1 1 1 1 1 1 2 2 2 2 3 3 3
#2 2 3 4 5 6 3 4 5 6 4 5 6
# id1.13 id1.14 id1.15 id2.1 id2.2 id2.3
#1 4 4 5 10 10 11
#2 5 6 6 11 12 12
或者
map_dfc(a, ~data.frame(combn(.x, 2)))
# X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X21 X31
#1 1 1 1 1 1 2 2 2 2 3 3 3 4 4 5 10 10 11
#2 2 3 4 5 6 3 4 5 6 4 5 6 5 6 6 11 12 12
我们可以用 base R
do.call(cbind, lapply(a, combn, 2))
#[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#[1,] 1 1 1 1 1 2 2 2 2 3 3 3 4 4
#[2,] 2 3 4 5 6 3 4 5 6 4 5 6 5 6
# [,15] [,16] [,17] [,18]
#[1,] 5 10 10 11
#[2,] 6 11 12 12
我需要为列表中的每个元素计算内部元素的所有组合,并存储所有组合(示例中的 b)。 我目前正在做我的例子,但对于更大的列表,它真的很慢,因为在循环中使用了 cbind。 因为我不知道我的向量 b 的最终总大小,所以我一开始无法分配对象。 我正在寻找其他替代方案以提高效率。
b=0
a = list(id1=c(1,2,3,4,5,6),id2=c(10,11,12))
for(i in 1:length(a)){
temp=combn(a[[i]],2)
b=cbind(b,temp)
}
这里是来自评论的 Arun 解决方案的替代方案,使用 purrr::map
data.frame(purrr::map(a, combn, 2))
# id1.1 id1.2 id1.3 id1.4 id1.5 id1.6 id1.7 id1.8 id1.9 id1.10 id1.11 id1.12
#1 1 1 1 1 1 2 2 2 2 3 3 3
#2 2 3 4 5 6 3 4 5 6 4 5 6
# id1.13 id1.14 id1.15 id2.1 id2.2 id2.3
#1 4 4 5 10 10 11
#2 5 6 6 11 12 12
或者
map_dfc(a, ~data.frame(combn(.x, 2)))
# X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X21 X31
#1 1 1 1 1 1 2 2 2 2 3 3 3 4 4 5 10 10 11
#2 2 3 4 5 6 3 4 5 6 4 5 6 5 6 6 11 12 12
我们可以用 base R
do.call(cbind, lapply(a, combn, 2))
#[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#[1,] 1 1 1 1 1 2 2 2 2 3 3 3 4 4
#[2,] 2 3 4 5 6 3 4 5 6 4 5 6 5 6
# [,15] [,16] [,17] [,18]
#[1,] 5 10 10 11
#[2,] 6 11 12 12