2

这个问题已经让我困惑了几天。假设我有两个矩阵:

matrix_a <- matrix(0, nrow = 3, ncol = 3, 
                   dimnames = list(c("r1", "r2", "r3"), c("c1", "c2", "c3")))
matrix_b <- matrix(c("r1", "r2", "c1", "c2"), nrow = 2, ncol = 2)

我想matrix_a在一个函数中动态修改:

change_var <- function(x, matrix_a) {
    if(any(rownames(matrix_a) == x[1])  && any(colnames(matrix_a) == x[2])) {
        matrix_a[x[1], x[2]] <- 1
        return (matrix_a)
    }
}
apply(matrix_b, 1, change_var, matrix_a)

但是,似乎此代码根本无法更改matrix_a。但我的预期结果matrix_a应该是

   c1 c2 c3
r1  1  0  0
r2  0  2  0
r3  0  0  0

我们如何才能实现动态修改的目标matrix_a?请为我提供一个非循环解决方案。提前致谢。

4

1 回答 1

0

如您所知,<<-或者assign可以用来修改“全局”变量。与<<-调用非常相似。assigninherits=TRUE

...但是您似乎正在尝试创建一个矩阵来计算由 matrix_b 给出的单元格坐标的出现次数?使用该table函数可以更有效地完成(没有 for 循环!)。我添加了一个重复的行matrix_b以表明它有效:

matrix_a <- matrix(0, nrow = 3, ncol = 3, 
                   dimnames = list(c("r1", "r2", "r3"), c("c1", "c2", "c3")))
matrix_b <- matrix(c("r1", "r2", "r2", "c1", "c2", "c2"), nrow = 3, ncol = 2)
# Convert matrix_b from 2-d to 1-d indices
row <- match(matrix_b[,1], rownames(matrix_a))
col <- match(matrix_b[,2], colnames(matrix_a))
idx <- row+(col-1)*nrow(matrix_a)
# Then count the number of identical indices using table
matrix_a[sort(unique(idx))] <- table(idx)

更新matrix_a到:

   c1 c2 c3
r1  1  0  0
r2  0  2  0
r3  0  0  0

...当然,如果您只需要在其中放置 a 1,则无需致电table

row <- match(matrix_b[,1], rownames(matrix_a))
col <- match(matrix_b[,2], colnames(matrix_a))
idx <- row+(col-1)*nrow(matrix_a)
matrix_a[idx] <- 1
于 2011-07-26T00:06:50.633 回答