【问题标题】:R dataframe filteringR数据框过滤
【发布时间】:2011-04-07 19:37:17
【问题描述】:

我有一个数据框 df 如下:

 A  B  C
 NA 1  2
 2  NA 3
 4   5 6
 7   8 9

我想要做的是删除所有具有NA 的行。

如果我使用

 apply(df,1,function(row) all(!is.na(row)))

我得到所有行的列表,其中包含 TRUE(如果该行不包含 NA)和 FALSE(如果该行包含 NA)。 但是我如何获得行名以便我可以创建一些像

df2<-df[-c(list of rows that contains NA),] 

这将为我提供所有新的数据框,其中 NA 成行。

提前致谢。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    假设您有一个如下所示的数据框:

       A  B C
    1 NA  1 2
    2  2 NA 3
    3  4  5 6
    4  7  8 9
    

    那就试试吧:

    df1[apply(df1,1,function(x) !any(is.na(x))), ]
      A B C
    3 4 5 6
    4 7 8 9
    

    它不使用行名,而是使用逻辑向量。我猜 Joshua 和我读你的问题的方式不同,但我们使用了相同的方法。

    Joshua 的建议更简洁:

    > na.omit(df1)
      A B C
    3 4 5 6
    4 7 8 9
    

    它提醒我应该使用:

    > df1[complete.cases(df1), ]
      A B C
    3 4 5 6
    4 7 8 9
    

    【讨论】:

    • 我不明白他们是想要 with NA 还是那些 没有 NA 的行。如果是后者,na.omit 更简单。
    【解决方案2】:

    您可以使用来自 apply 调用的逻辑向量来索引您的 data.frame。

    > Data[!apply(Data,1,function(row) all(!is.na(row))),]
       A  B C
    1 NA  1 2
    2  2 NA 3
    > # or like this:
    > Data[apply(Data,1,function(row) any(is.na(row))),]
       A  B C
    1 NA  1 2
    2  2 NA 3
    

    【讨论】:

      【解决方案3】:

      data.frame 上的is.na 返回一个matrix,这是更适合申请的候选对象:

      df <- read.table(textConnection(" A  B  C
      NA 1  2
      2  NA 3
      4   5 6
      7   8 9
      "))
      
      ## a matrix
      is.na(df)
      
      ## logical for selecting rows that are all NA
      apply(df, 1, function(x) all(is.na(x)))
      
      ##  one liner
      df[!apply(df, 1, function(x) all(is.na(x))), ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 2017-01-03
        • 2021-03-16
        • 1970-01-01
        • 1970-01-01
        • 2014-02-28
        • 1970-01-01
        相关资源
        最近更新 更多