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

R 用矩阵的行索引替换矩阵中的行值,r,matrix,indexing,row,R,Matrix,Indexing,Row,我使用一个r矩阵(例如[[0,0,0,1],[0,1,0,1],[1,0,0,0],[0,0,1]])表示 光栅。我想用它的行索引值替换除0之外的所有值。有类似的吗 matrix[matrix==1] <- row_index matrix[matrix==1]希望不要因为建议使用for循环而大发雷霆,但我们会看到: 这是你的矩阵 mymat <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1),

我使用一个r矩阵(例如
[[0,0,0,1],[0,1,0,1],[1,0,0,0],[0,0,1]]
)表示 光栅。我想用它的行索引值替换除0之外的所有值。有类似的吗

matrix[matrix==1] <- row_index

matrix[matrix==1]希望不要因为建议使用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

对于简洁、富有表现力的解决方案,我可能会使用以下方法:

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

m也许我没有抓住你问题的重点,但是你呢

> 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
>
>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按列填充矩阵,逐项乘积运算符通过逐列复制矩阵使两个矩阵一致,直到它们匹配为止。此处的*运算符将每个项目乘以它所属的行。)

我正在尝试使用
哪个(m==1)%%4
,并被替换为
4
(正好可以被4整除)的
0
所困扰。这太棒了!我要记住
。@Arun——我感觉到你了。我花了太长时间才学会这三个超级有用的相关咒语:
m-Heh。我甚至不知道
。很好。哇,这正是我想要的。非常感谢。@user2132627,请务必单击Josh答案旁边的复选标记,将其答案标记为已接受,如果它正是您要查找的答案!谢谢
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
> 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
>