2016-09-23 86 views
0

這可能與之前發佈的其他類似問題相同,但我無法找到完全匹配(如果此處已存在,請直接與我聯繫)。根據同一個向量中的值更改向量值

無論如何,我有一個19列和5000行的矩陣。每行包含在0.1(所以,0.0,0.1,0.2 ... 1.0)等從而增量在0.0和1之間的一個值:

0 0.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
... 
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0.9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0.8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

所以矢量從1到0.1在再次重新開始之前1並轉移到下一列。我想要一個基本上從一行到另一行的函數,看看是否有一個數值,然後將1減去該值的下一個位置。有效的是這樣的:

0 0.6 0.4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0.5 0.5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0.4 0.6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
... 
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0.9 0.1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0.8 0.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

我試過用「應用」或只圖基重新編碼,但竅門就是通過一切〜5000行運行的幾件事情。也許我應該通過閱讀專欄來處理它?

+0

您可以使用'ifelse'工作列,檢查以前的列值並在條件匹配時更改當前列。 'ifelse'是矢量化的,所以每列操作都很快。你需要一個for循環從最右邊的列開始。 – dracodoc

+0

另一種方法是計算要更改的單元格的所有索引,將它們放入一個向量中,並按照相同順序計算所有要更新的值,放入另一個向量中,然後按索引更新它們。 – dracodoc

回答

0

分別考慮價值和指標。 R中的索引可能非常強大。

# simulate data. smaller size for simplification 
m <- matrix(0, nrow = 200, ncol = 12) 
r_indice <- 1:200 
c_indice <- rep(2:11, each = 10) 
m[cbind(r_indice, c_indice)] <- rep(seq(0.1, 1, by = 0.1), 10) 

# find non-zero value indice 
value_indice <- which(m !=0, arr.ind = T) 
new_value_indice <- value_indice 
new_value_indice[, 2] <- new_value_indice[, 2] + 1 
m[new_value_indice] <- 1 - m[value_indice] 
+0

謝謝!這工作完美。我沒有考慮一次對整個矩陣進行索引。我必須做出的唯一改變是在我的矩陣末尾添加一個虛擬列以適應列索引引用中的「+1」偏移,否則我得到「下標越界」錯誤。我現在可以簡單地刪除該列而不影響矩陣的其餘部分。 – Jsukup

0

這是一種將簡單矩陣乘法和矩陣索引相結合的方法。首先,我們創建一個19×20矩陣,每行中有1對和1對。

mat <- diag(20) 
mat[row(mat) - col(mat) == -1] <- -1 
mat <- mat[-20, ] 

mat樣子:

#  [,1] [,2] [,3] [,4] [,5] [,6] ... 
# [1,] 1 -1 0 0 0 0 
# [2,] 0 1 -1 0 0 0 
# [3,] 0 0 1 -1 0 0 
# [4,] 0 0 0 1 -1 0 
# [5,] 0 0 0 0 1 -1 
# [6,] 0 0 0 0 0 1 
# ... 

假設你原來的矩陣是x。然後,我們乘xmat

y <- x %*% mat 

,使我們得到相同的數字作爲x,而且這些數字在相鄰列負:

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 0 0.6 -0.6 0.0 0 0 
[2,] 0 0.5 -0.5 0.0 0 0 
[3,] 0 0.4 -0.4 0.0 0 0 
[4,] 0 0.0 1.0 -1.0 0 0 
[5,] 0 0.0 0.9 -0.9 0 0 
[6,] 0 0.0 0.8 -0.8 0 0 

最後,加1所有負數:

y[y < 0] <- (y + 1)[y < 0] 
y[1:6, 1:6] 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 0 0.6 0.4 0.0 0 0 
# [2,] 0 0.5 0.5 0.0 0 0 
# [3,] 0 0.4 0.6 0.0 0 0 
# [4,] 0 0.0 1.0 0.0 0 0 
# [5,] 0 0.0 0.9 0.1 0 0 
# [6,] 0 0.0 0.8 0.2 0 0