【问题标题】:Setting matrix values comparing to vector in R设置矩阵值与 R 中的向量进行比较
【发布时间】:2017-01-28 13:14:06
【问题描述】:

我想在矩阵的每个元素中设置 NA,其中列中的值大于或等于给定向量的值。例如,我可以创建一个矩阵:

set.seed(1)
zz <- matrix(data = round(10L * runif(12)), nrow = 4, ncol = 3)

这给了 zz:

     [,1] [,2] [,3]
[1,]    8    5    7
[2,]    6    5    1
[3,]    5   10    3
[4,]    9    1    9

对于比较向量(例如):

xx <- round(10L * runif(4))

xx 在哪里:

[1] 6 3 8 2

如果我执行此操作:

apply(zz,2,function(x) x >= xx)

我明白了:

      [,1]  [,2]  [,3]
[1,]  TRUE FALSE  TRUE
[2,]  TRUE  TRUE FALSE
[3,] FALSE  TRUE FALSE
[4,]  TRUE FALSE  TRUE

我想要的是任何我有一个 TRUE 元素的地方我想要一个 NA 并且我有一个 FALSE 我得到 zz 矩阵中的数字(例如,手动...):

NA  5  NA
NA  NA 1
5   NA 3
NA  1  NA

我可以拼凑一些“for”循环来做我想做的事,但是有没有基于向量的方法来做到这一点??

感谢任何提示。

【问题讨论】:

  • 将矩阵与向量进行比较是按列进行的,因此您可以使用zz &gt;= xx。还有is.na(zz) = zz &gt;= xx
  • 谢谢,亚历克西斯。不太明白为什么使用“=”而不是“

标签: r matrix vector subset


【解决方案1】:

你可以这样做:

zz[zz>=xx] <- NA

#     [,1] [,2] [,3]
#[1,]   NA    5   NA
#[2,]   NA   NA    1
#[3,]    5   NA    3
#[4,]   NA    1   NA

【讨论】:

  • 我可以发誓我先尝试过,但没有成功。明显地!谢谢。
【解决方案2】:

这是获得预期输出的一种选择。我们得到一个逻辑矩阵(zz &gt;= xx),使用NA^ 对 TRUE 值返回 NA,对 FALSE 返回 1,然后将其与原始矩阵 'zz' 相乘,这样 NA 保持不变,而 1 更改为相应的'zz' 中的值。

NA^(zz >= xx)*zz
#     [,1] [,2] [,3]
#[1,]   NA    5   NA
#[2,]   NA   NA    1
#[3,]    5   NA    3
#[4,]   NA    1   NA

或者另一个选项是ifelse

ifelse(zz >= xx, NA, zz)

数据

zz <- structure(c(8, 6, 5, 9, 5, 5, 10, 1, 7, 1, 3, 9), .Dim = c(4L, 3L))
xx <- c(6, 3, 8, 2)

【讨论】:

  • akrun,第一个答案是最棘手的,但它有效,第二个答案也是如此,更容易理解。谢谢!厄尼
猜你喜欢
  • 2017-08-05
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多