我大約六個月前開始使用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