这个问题已经困扰我好几天了。假设我有两个矩阵:
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
动态修改的目标?请给我一个非for循环的解决方案。提前感谢。
您已经知道,<<-
或assign
可用于修改"全局"变量。<<-
非常类似于用inherits=TRUE
调用assign
。
…但看起来你是在尝试创建一个矩阵来计算由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
…当然,如果你只需要在那里放一个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