【问题标题】:Replace matrix/dataframe values found in column i with i-th element of vector将第 i 列中的矩阵/数据框值替换为向量的第 i 个元素
【发布时间】:2016-07-08 12:26:35
【问题描述】:

假设您有一个 3 x 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)

当然,vlength 必须与m 中的列数匹配。所以矩阵是这样的:

0 2 3
4 0 6
0 8 0

我希望每当 R 在 m 的第一列中找到零时,它会将其替换为向量 v 的第一个元素,依此类推,这样最终的结果将是:

1 2 3
4 5 6
1 8 9

我做了很多研究,还没有找到解决这个问题的方法。有人可以帮忙吗?

【问题讨论】:

  • m[m==0] &lt;- v[1] 给出了想要的结果
  • 在你想要的结果中,与你的问题描述相反,你总是用v[1]替换零。
  • 您的描述听起来好像结果应该是matrix( c(1,4,1,2,5,8,3,6,9), 3)
  • 是的,在我的描述中,我未能正确重现最终结果。我将编辑问题以更正此问题。
  • @42-:感谢您的编辑。我注意到您添加了byrow = TRUE

标签: r matrix replace dataframe


【解决方案1】:
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

【讨论】:

  • OP 希望按列显示,所以我认为应该是:m + t((t(m) == 0) * v)
  • 谢谢朱利叶斯。您的答案使用矩阵乘法,我非常喜欢这种解决问题的方式。
  • 它看起来确实是各种各样的。我仍然盯着它想知道它实际上是如何工作的。
【解决方案2】:

我认为您提出的解决方案是错误的,这里是您文本中描述的问题的解决方案。当which.arr.ind=TRUE 一起调用时,它返回一个两列矩阵,可用于矩阵或数据帧索引作为i、i 参考。在这种情况下,您还可以将其第二列用作v-object 的索引。

> 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

【讨论】:

  • 谢谢 42-。你的回答告诉我应该了解更多关于which 命令和arr.ind 参数的信息。非常感谢
  • m[m==0] &lt;- v[col(m)[m==0]] 作为变体
  • 这看起来很漂亮。需要看看还有什么其他潜力。随时发布替代答案。我当然会赞成。
猜你喜欢
  • 1970-01-01
  • 2021-10-17
  • 2020-09-20
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多