首页 文章

设置矩阵值与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

我想要的是无处不在我有一个TRUE元素我想要一个NA而且每个地方我都有一个FALSE我得到zz矩阵中的数字(例如,手动......):

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

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

谢谢你的任何提示 .

2 回答

  • 2

    你可以这样做:

    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 >= xx) ,使用 NA^ ,返回NA表示TRUE值,1表示FALSE,然后将其与原始矩阵'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)
    

相关问题