【发布时间】:2013-03-06 16:28:05
【问题描述】:
大约 6 个月前我开始使用 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 被确定为代码的另一部分的一部分,因此我无法使用绝对索引号),我想减少相同的时间。任何帮助将不胜感激。谢谢。
【问题讨论】:
-
为什么这个标签是
html,只有那个? -
作为一般的好习惯,您可能希望避免通过函数名称调用变量(如
c)