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

3

我使用一个r-matrix(例如[[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)上的R 2.15.1和RPY2 2.2.6启动R方法。 还有没有其他方法可以获得像直方图卡方检验等统计函数的合理结果?

3个回答

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

我曾尝试使用 which(m == 1) %% 4,并且一直在将 0 替换为 4(即可被 4 整除的数字)。这太棒了!必须记住 row - Arun
1
@Arun -- 我理解你的感受。我花了太长时间才学会这三个超级有用且相关的咒语:m <- diag(3); row(m); col(m); which(m==1, arr.ind=TRUE) - Josh O'Brien
呵呵,我甚至不知道row。不错。 - A5C1D2H2I1M1N2O1R2T1
2
@user2132627,请务必点击Josh答案旁边的复选标记,如果它正是你要寻找的!谢谢。 - A5C1D2H2I1M1N2O1R2T1

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
}

Here's the result.

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

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
>

(预计时间:R通过列填充矩阵,并且逐个乘积运算符通过复制它们的列,直到它们适合为止,使得涉及的两个矩阵符合要求。在这里,*运算符最终将每个项与其所属的行相乘。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接