在R中将矩阵的值与向量进行比较设置

4

我希望在矩阵的每个元素中设置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

我需要的是,每当有一个真实元素时,我希望获得一个NA,并且每当我有一个假的时候,我要获得矩阵zz中的数字(例如,手动...):
NA  5  NA
NA  NA 1
5   NA 3
NA  1  NA

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

感谢任何提示。


3
将矩阵和向量进行比较是逐列进行的,因此您可以只使用 zz >= xx。并且is.na(zz) = zz >= xx - alexis_laz
谢谢,Alexis。我不太明白为什么要使用“=”而不是“<-”,但它确实有效。 - Ernie
2个回答

2
这里有一种方法可以获得期望的输出。我们使用逻辑矩阵 (zz >= 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)

1
akrun,第一个答案最棘手,但它有效,第二个答案也有效,并且更易于理解。谢谢!Ernie - Ernie

2

您可以简单地执行以下操作:

zz[zz>=xx] <- NA

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

我本来就试过这个,但没成功。显然是我的问题!谢谢。 - Ernie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接