大约六个月前,我开始使用 R,并且在 R 方面获得了一些经验。最近,我遇到了一个关于矩阵中的子集的问题,并且希望帮助我制定更高效的解决方案。
我想做的是以下。假设我有一个矩阵和两个向量,如下所示:
# 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
被确定为代码的另一部分的一部分所以我不能使用绝对索引号),我想减少同样的时间。任何帮助将不胜感激。谢谢你。