【问题标题】:Omitting the whole list if NA present如果na存在,省略整个列表
【发布时间】:2021-07-02 19:51:27
【问题描述】:

假设我有一个列表列表:

d <- list(matrix(c(1:6),nrow=3,ncol=2),matrix(c(7:12),nrow=3,ncol=2))
e <- list(matrix(c(1:6),nrow=3,ncol=2),matrix(c(7:9,NA,NA,12),nrow=3,ncol=2))
f <- list(d,e)
rapply(f, na.omit, how = "replace")

当我使用这个rapply 函数时,它只会删除其中包含NA 的行。如果在那里找到任何NA,我希望删除整个列表。我的意思是,既然我们在列表e 中有NA,那么我希望列表e 完全从列表f 中消失。我该怎么做?

PS。我正在使用的真实数据与我在这里复制的数据略有不同。这是一个包含 550 多个列表的长列表,每个列表都是 8 x 6 数据帧。这是它的外观快照。我不确定我在这里复制的答案是否与我的真实数据相同,但让我们试一试! (在真实数据中,部分 Bid Yield 值为NA's)

PS2。如果您认为答案不同,我可以通过 google drive 共享数据。

任何帮助将不胜感激!

【问题讨论】:

    标签: r list na


    【解决方案1】:

    你可以使用Filter

    Filter(function(x) all(!is.na(unlist(x))), f)
    
    [[1]]
    #[[1]][[1]]
    #     [,1] [,2]
    #[1,]    1    4
    #[2,]    2    5
    #[3,]    3    6
    
    #[[1]][[2]]
    #     [,1] [,2]
    #[1,]    7   10
    #[2,]    8   11
    #[3,]    9   12
    

    【讨论】:

      【解决方案2】:

      这是使用 apply 函数的基本 R 方法:

      ind <- sapply(f, function(x) sum(sapply(x, function(y) sum(is.na(y)))) == 0)
      f[ind]
      
      [[1]]
      [[1]][[1]]
           [,1] [,2]
      [1,]    1    4
      [2,]    2    5
      [3,]    3    6
      
      [[1]][[2]]
           [,1] [,2]
      [1,]    7   10
      [2,]    8   11
      [3,]    9   12
      

      请注意,e 矩阵列表已完全删除,因为该列表的矩阵之一在其中包含 NA 值。

      数据:

      d <- list(matrix(c(1:6),nrow=3,ncol=2), matrix(c(7:12), nrow=3, ncol=2))
      e <- list(matrix(c(1:6),nrow=3,ncol=2), matrix(c(7:9,NA,NA,12), nrow=3, ncol=2))
      f <- list(d, e)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-07
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-14
        • 2012-12-08
        相关资源
        最近更新 更多