Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当最终尺寸未知时,R到cbind循环中的替代方案_R_Cbind - Fatal编程技术网

当最终尺寸未知时,R到cbind循环中的替代方案

当最终尺寸未知时,R到cbind循环中的替代方案,r,cbind,R,Cbind,我需要为列表中的每个元素计算所有元素的组合,并存储所有组合(示例中的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,t

我需要为列表中的每个元素计算所有元素的组合,并存储所有组合(示例中的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解决方案的替代方案,使用
purr::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


下面是来自注释的Arun解决方案的替代方案,使用
purr::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


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

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

您可以这样做
do.call(cbind,lappy(a,combn,2))
即使您没有遵循@akrun的建议(一种单行解决方案),也可以从
b开始,为什么您不知道最终的尺寸?它是总和(选择(长度(a),2L))
?(如果你有意初始化
b=0
而不是
b=NULL
),你可以这样做
do.call(cbind,lapply(a,combn,2))
,即使你没有遵循@akrun的建议(一个线性解决方案),也可以从
b开始,为什么你不知道最终的大小?它是总和(选择(长度(a),2L))
?(如果您有意初始化
b=0
而不是
b=NULL
,则加上一个选项)我本来希望
purr::map
解决方案更快,但事实并非如此(I
microbenchmark
ed有各种更大的列表);只是出于好奇:你有没有直观的解释?总之+1服务所有tidyverse功能都是方便整洁的使用方式,效率是副作用之一。因此,与base R或data.table相比,某些函数的效率可能没有那么高。出于好奇,base R方法返回一个矩阵,而用
data.frame
包装的映射返回data.frame,这在属性方面有一些开销。在这里,你将
lappy(a,combn,2)
map(a,combn,2)
进行比较,我明白你的意思。我比较了
do.call(cbind,lappy(a,combn,2))
map\u-dfc(a,~data.frame(combn(.x,2))
。我希望
do.call(cbind,…)
部分比
map\u-dfc
慢,但它不是;-)我猜
do.call(cbind,…)
实际上相当快,因为它本质上是一个
矩阵
操作,而
map\u dfc
有您所说的转换为
数据的开销。frame
s。我原以为
purr::map
解决方案会更快,但事实并非如此(I
microbenchmark
ed有各种更大的列表);只是出于好奇:你有没有直观的解释?总之+1服务所有tidyverse功能都是方便整洁的使用方式,效率是副作用之一。因此,与base R或data.table相比,某些函数的效率可能没有那么高。出于好奇,base R方法返回一个矩阵,而用
data.frame
包装的映射返回data.frame,这在属性方面有一些开销。在这里,你将
lappy(a,combn,2)
map(a,combn,2)
进行比较,我明白你的意思。我比较了
do.call(cbind,lappy(a,combn,2))
map\u-dfc(a,~data.frame(combn(.x,2))
。我希望
do.call(cbind,…)
部分比
map\u-dfc
慢,但它不是;-)我猜
do.call(cbind,…)
实际上相当快,因为它本质上是一个
矩阵
操作,而
map\u dfc
有您所说的从转换到
data.frame的开销。