基于相同向量中的值更改向量值

时间:2016-09-23 22:52:54

标签: r vector

这可能与之前发布的其他内容类似,但我无法找到完全匹配(如果已经在此处,请指示我)。

无论如何,我有一个包含19列和〜5,000行的矩阵。每行包含一个介于0.0和1之间的值,增量为.1(所以,0.0,0.1,0.2 ...... 1.0),如下所示:

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

我已尝试了一些事情&#34; apply&#34;或者只是基础重新编码,但技巧是让它运行所有〜5,000行。也许我应该通过列来处理它?<​​/ p>

2 个答案:

答案 0 :(得分:0)

这是一种结合简单矩阵乘法和矩阵索引的方法。首先,我们创建一个19 x 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

答案 1 :(得分: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]