这可能与之前发布的其他内容类似,但我无法找到完全匹配(如果已经在此处,请指示我)。
无论如何,我有一个包含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>
答案 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
。然后我们将x
和mat
:
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]