我大约六个月前开始使用R,并且我在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',只有是什么? – CBroe 2013-03-18 11:04:04
作为一般的良好实践,您可能希望避免通过函数名称调用变量(如'c') – ds440 2013-03-18 15:09:40