【问题标题】:Remove rows in R matrix where all data is NA [duplicate]删除 R 矩阵中所有数据为 NA 的行 [重复]
【发布时间】:2011-09-22 05:40:22
【问题描述】:

可能重复:
Removing empty rows of a data file in R

如何从矩阵或数据框中删除行中所有元素为 NA 的行?

所以要从中得到:

     [,1] [,2] [,3]
[1,]    1    6   11
[2,]   NA   NA   NA
[3,]    3    8   13
[4,]    4   NA   NA
[5,]    5   10   NA

到这里:

     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    3    8   13
[3,]    4   NA   NA
[4,]    5   10   NA

因为 na.omit 的问题在于它会删除带有 any NA 的行,所以会给我这个:

     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    3    8   13

到目前为止,我能做的最好的事情就是使用 apply() 函数:

> x[apply(x, 1, function(y) !all(is.na(y))),]
     [,1] [,2] [,3]
[1,]    1    6   11
[2,]    3    8   13
[3,]    4   NA   NA
[4,]    5   10   NA

但这似乎很复杂(有没有我遗漏的更简单的东西?)....

谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    使用 rowSums() 的解决方案通常优于 apply() 的解决方案:

    m <- structure(c( 1,  NA,  3,  4,  5, 
                      6,  NA,  8, NA, 10, 
                     11,  NA, 13, NA, NA), 
                   .Dim = c(5L, 3L))
    
    m[rowSums(is.na(m)) != ncol(m), ]
    
         [,1] [,2] [,3]
    [1,]    1    6   11
    [2,]    3    8   13
    [3,]    4   NA   NA
    [4,]    5   10   NA
    

    【讨论】:

    • 这与链接问题的解决方案相同,只是列数是硬编码的。
    • 我看你是对的。将投票结束。
    【解决方案2】:

    跨行扫描all(is.na()) 的测试,并删除正确的地方。像这样的东西(未经测试,因为您没有提供生成数据的代码——dput() 是您的朋友):

     R> ind <- apply(X, 1, function(x) all(is.na(x)))
     R> X <- X[ !ind, ]
    

    【讨论】:

    • 可能会慢一些,但我喜欢它,因为它更好地表达了逻辑
    • 此选项也适用于非数字数据。但是链接问题中的应用解决方案避免了索引并在一行中完成。
    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2019-12-27
    • 2013-11-25
    • 2018-10-21
    相关资源
    最近更新 更多