【问题标题】:How to remove rows from a R data frame that have NA in two columns (NA in both columns NOT either one)? [duplicate]如何从 R 数据框中删除两列中具有 NA 的行(两列中的 NA 都不是)? [复制]
【发布时间】:2016-11-23 06:46:03
【问题描述】:

我在下面有一个 R 数据框 df

a   b   c

1   6  NA
2  NA  4
3   7  NA
NA  8  1
4   9  10
NA  NA  7
5   10  8

我想删除在 a & b 中都有 NA 的行

我想要的输出是

a   b  c

1   6  NA
2  NA  4
3   7  NA
NA  8  1
4   9  10
5  10  8

我在下面尝试过这样的事情

df1<-df[(is.na(df$a)==FALSE & is.na(df$b)==FALSE),]

但这会删除所有的 NA(执行 OR 功能)。我需要在这里做 AND 操作。

我该怎么做?

【问题讨论】:

  • 这个which(rowSums(df, na.rm = T)&gt;0)怎么样。
  • df[ rowSums(is.na(df[ , 1:2]) ) == 2, ]

标签: r dataframe na


【解决方案1】:

你可以试试:

df1<-df[!(is.na(df$a) & is.na(df$b)), ]

【讨论】:

    【解决方案2】:

    使用rowSums

    df[!rowSums(is.na(df))==2,]
    

    保存一个字符会更好[1]

    df[rowSums(is.na(df))!=2,]
    

    输出:

       a  b
    1  1  6
    2  2 NA
    3  3  7
    4 NA  8
    5  4  9
    7  5 10
    

    可以使用ncol进行泛化

    df[!rowSums(is.na(df))==ncol(df),]
    

    [1] 学分:alistaire

    【讨论】:

    • 你可以保存一个字符并使用!=
    【解决方案3】:

    我们可以在逻辑矩阵 (is.na(df1)) 上使用 rowSums 并将其转换为逻辑向量 (rowSums(...) &lt; ncol(df1)) 以对行进行子集化。

    df1[rowSums(is.na(df1)) < ncol(df1),]
    

    或者另一个选项是Reducelapply

    df1[!Reduce(`&`, lapply(df1, is.na)),]
    

    【讨论】:

      【解决方案4】:

      另一种方法

      df[!apply(is.na(df),1,all),]
      #   a  b
      #1  1  6
      #2  2 NA
      #3  3  7
      #4 NA  8
      #5  4  9
      #7  5 10
      

      数据

      df <- structure(list(a = c(1L, 2L, 3L, NA, 4L, NA, 5L), b = c(6L, NA, 
      7L, 8L, 9L, NA, 10L)), .Names = c("a", "b"), class = "data.frame", row.names = c(NA, 
      -7L))
      

      【讨论】:

        【解决方案5】:

        这也可以:

        df[apply(df, 1, function(x) sum(is.na(x)) != ncol(df)),]
        
           a  b
        1  1  6
        2  2 NA
        3  3  7
        4 NA  8
        5  4  9
        7  5 10
        

        【讨论】:

          【解决方案6】:

          我的想法和其他回复基本一样。

          考虑到具有所有 NA 的特定行的任何数据集,!is.na(ROW) 的总和将始终为零。所以你只需要去掉那一行。

          所以你可以这样做:

          df1 = df[-which(rowSums(!is.na(df))==0),]
          

          【讨论】:

            猜你喜欢
            • 2022-09-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-07-04
            • 1970-01-01
            • 2016-10-01
            • 2018-12-15
            相关资源
            最近更新 更多