2016-09-23 87 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