私は約 6 か月前に R を使い始め、R で少し経験を積んできました。最近、マトリックス内のサブセットに関する問題に遭遇し、私が持っているソリューションをより効率的にするための支援を求めています。
私がやりたいことは次のとおりです。次のような行列と 2 つのベクトルがあるとします。
# matrix
a <- matrix(seq(1,100,by=1),10,10)
# vector (first column of matrix a)
b <- c(2,4,5,6,7,8)
# vector (column numbers of matrix a)
c <- c(5,3,1,4,6,2)
繰り返しますが、
- ベクトル
b
は、行列の最初の列を参照しますa
。 - ベクトル
c
は、行列の列番号を参照しますa
。
頂きたいですtmp99 <- a[b,c:8]
。ただし、これを行うと、次の警告メッセージが表示されます。
Warning message:
In c:8 : numerical expression has 6 elements: only the
first used (index has to be scalar and not vector)
それで、ループとリストを使用して問題を回避しようとしましたが、必要な解決策が得られました。これよりも時間効率の良い解決策があると思います。私がこれまでに持っている解決策は次のとおりです。
a <- matrix(seq(1,100,by=1),10,10)
b <- c(2,4,5,6,7,8)
c <- c(5,3,1,4,6,2)
tmp <- list()
for (i in 1:length(b)) tmp[[i]] <- c(a[b[i],(c[i]:8)])
tmp99 <- t(sapply(tmp, '[', 1:max(sapply(tmp, length))))
tmp99[is.na(tmp99)] <- 0
私が知りたいのは、ループを使用して上記を達成することを避ける方法があるかどうかです。なぜなら、私の行列の次元は200000 x 200
そうであり、これを頻繁に行う必要があるからです (私の問題でb
はc
、コードの別の部分の一部として決定されます)したがって、絶対インデックス番号を使用することはできません)、同じためにかかる時間を短縮したいと思います。どんな助けでも大歓迎です。ありがとうございました。