这个小问题是大代码的瓶颈,必须重复至少几千次,所以这里的主要问题是速度。
我有一个数字向量,例如:
v <- c(1,3,5)
我想知道我可以用该子集进行的所有组合。并将它们设置为0和1的矩阵,例如:
col1 col2 col3 col4 col5 col6 col7
1 1 0 0 1 1 0 1
3 0 1 0 1 0 1 1
5 0 0 1 0 1 1 1
其实我正在使用功能combn(我认为这是干净的最快方式,对吗?)
matrix <- lapply(seq(length(v)),function(i){
submatrix <- combn(x = 1:length(v), m=i)
#code follows after a brief explanation
我会得到三个矩阵,如:
1 2 3
1 1 2
2 3 3
1
2
3
所以为了获得1和0的矩阵,我用双填充它。 (在这里,我可能会加快速度)
list_matrix <- lapply(seq(length(v)),function(i){
submatrix <- combn(x = 1:length(v), m=i)
1matrix <- matrix(data = 0, nrow = length(v), ncol = dim(submatrix)[2])
for(k in seq(dim(submatrix)[2]))
for(j in seq(dim(submatrix)[1]))
1matrix[submatrix[j,k],k] <- 1
return(1matrix) })
我所展示的是代码中最慢的部分。对于此示例,需要大约0.012秒。下一步很简单。
我得到的是三个矩阵:
col1 col2 col3
1 1 0 0
3 0 1 0
5 0 0 1
col1 col2 col3
1 1 1 0
3 1 0 1
5 0 1 1
col1
1 1
3 1
5 1
现在这个过程非常简单快捷。
final_matrix <- list_matrix[[1]]
for(i in seq(2,length(list_matrix))
final_matrix <- cbind(final_matrix, list_matrix[[i]]
这样做的目的是粘贴列来获取。它需要0.0033秒:
col1 col2 col3 col4 col5 col6 col7
1 1 0 0 1 1 0 1
3 0 1 0 1 0 1 1
5 0 0 1 0 1 1 1
我需要加快这个过程。我认为双重或者lapply正在放慢这个速度。如果有人可以发布一些帮助,我会很感激。
谢谢。
答案 0 :(得分:1)
您可以使用tabulate
来简化代码:
L <- sapply(1:length(v), function(i) combn(length(v),i,FUN=tabulate,nbins=length(v)))
do.call(cbind,L)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,] 1 0 0 1 1 0 1
#[2,] 0 1 0 1 0 1 1
#[3,] 0 0 1 0 1 1 1
请注意combn
本身很慢,因此您可能想要探索其更快的类似物,请参阅例如Faster version of combn