假设您有一个3乘3的矩阵m
,其中包含一个或多个零,并且您希望将每个零替换为给定的数字。
替换必须遵循以下规则:
如果在m
的第一列找到零,则应将其替换为向量v
的第一个元素,如果在m
的第二列找到零,那么它应该用向量v
的第二个元素替换,对于第三个列/向量元素则相同。
矩阵和向量是:
m <- matrix(c(0,2,3,4,0,6,0,8,0), 3, 3, byrow = TRUE)
v <- c(1,5,9)
当然,length
的{{1}}必须与v
中的列数匹配。矩阵是这样的:
m
我希望每当R在0 2 3
4 0 6
0 8 0
的第一列中找到零时,它就会用向量m
的第一个元素替换它,依此类推,这样最终的结果就是:
v
我做了很多研究,但没有找到解决这个问题的方法。有人可以帮忙吗?
答案 0 :(得分:4)
m + t((t(m) == 0) * v)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# [3,] 1 8 9
或
m + sweep(m == 0, 2, v, `*`)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# [3,] 1 8 9
答案 1 :(得分:3)
我认为您提出的解决方案是错误的,这是解决您文本中描述的问题的方法。当使用which
调用.arr.ind=TRUE
时,它返回一个两列矩阵,可用于矩阵或数据帧索引,如i,i reference。在这种情况下,您还可以使用其第二列作为v
- 对象的索引。
> m[ which(m==0, arr.ind=TRUE) ] <- v[ which(m==0, arr.ind=TRUE)[,2] ]
> m
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 1 8 9