用行索引替换矩阵中的行值

时间:2013-03-04 17:02:44

标签: r matrix indexing row

我使用r矩阵(例如[[0,0,0,1],[0,1,0,1],[1,0,0,0],[0,0,1,1]])表示  一个栅格。我想用行索引值替换除0之外的每个值。有什么像

matrix[matrix==1] <- row_index

这样我的结果看起来像[[0,0,0,1],[0,2,0,2],[3,0,0,0],[0,0,4,4]]

我在Mac(10.7.5)和RPY2 2.2.6上使用R 2.15.1来启动R-Methods。 或者还有其他方法可以为histogramchi_square等统计函数获得合理的结果吗?

3 个答案:

答案 0 :(得分:5)

对于一个简洁,富有表现力的解决方案,我可能会使用它:

m <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1), 
            nrow = 4, byrow = TRUE)

m[m!=0] <- row(m)[m!=0]
m
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    0    2    0    2
# [3,]    3    0    0    0
# [4,]    0    0    4    4

答案 1 :(得分:2)

希望所有地狱都因为提出for循环而失败,但我们会看到:

这是你的矩阵

mymat <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1), 
                nrow = 4, byrow = TRUE)
mymat
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    0    1    0    1
# [3,]    1    0    0    0
# [4,]    0    0    1    1

这是一个for循环,它使用基本子集来标识您要替换的案例。

for (i in 1:nrow(mymat)) {
  mymat[i, ][mymat[i, ] != 0] <- i
}

这是结果。

mymat
#      [,1] [,2] [,3] [,4]
# [1,]    0    0    0    1
# [2,]    0    2    0    2
# [3,]    3    0    0    0
# [4,]    0    0    4    4

答案 2 :(得分:0)

也许我错过了你的问题,但是怎么样

> m <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1),
+             nrow = 4, byrow = TRUE)
> m * 1:nrow(m)
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    1
[2,]    0    2    0    2
[3,]    3    0    0    0
[4,]    0    0    4    4
>

(ETA:R按列填充矩阵,逐项产品运算符通过逐列复制它们使两个矩阵符合要求直到它们适合。*运算符此处将每个项目乘以它所属的行。)