この小さな問題は、少なくとも何千回も繰り返さなければならない大きなコードのボトルネックであるため、ここでの主な問題は速度です。
たとえば、数値のベクトルがあります。
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
次のような 3 つの行列が得られます。
1 2 3
1 1 2
2 3 3
1
2
3
したがって、1 と 0 の行列を取得するには、double for で埋めます。(ここでおそらく速度を上げることができます)
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 秒かかります。次のステップは簡単です。
私が得たのは3つのマトリックスです:
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
このプロセスをスピードアップする必要があります。ダブルフォーまたはラップリーがこれを遅くしていると思います。誰かが助けを投稿できれば、私はそれを感謝します。
ありがとうございました。