【问题标题】:Identify any NA in a data frame by ID in R通过 R 中的 ID 识别数据帧中的任何 NA
【发布时间】:2020-09-10 16:11:31
【问题描述】:

如果我有一个看起来像这样的数据框

df <- data.frame(ID = c("12","12","12","13","13","14","14"), 
Q1 = c(NA,"b",NA,"b",NA,"a","a"), 
Q2 = c(NA,"a",NA,"b",NA,"a","b"), 
Q3 = c(NA,"a",NA,"a",NA,"b","b"))

如何识别具有 ANY NA 的 ID?我只需要一次 ID。

结果我需要的是 12 13

我的数据框非常大,有些 ID 有很多缺失值,而另一些则没有。我确定如果一行(Q1、Q2 或 Q3)有缺失值,那么它们三个将有一个 NA。所有行都有 ID,该列没有 NA。

【问题讨论】:

    标签: r dataframe na


    【解决方案1】:

    使用rowSums() 尝试这种base R 方法,以计算NA 的数量。之后,which() 用于标识行:

    #Code
    df[which(rowSums(is.na(df[,-1]))>0),]
    

    输出:

      ID   Q1   Q2   Q3
    1 12 <NA> <NA> <NA>
    3 12 <NA> <NA> <NA>
    5 13 <NA> <NA> <NA>
    

    或者如果你只想要 id,你可以使用这个:

    #Code2
    unique(df[which(rowSums(is.na(df[,-1]))>0),1])
    

    输出:

    [1] "12" "13"
    

    【讨论】:

      【解决方案2】:

      您也可以使用完全适合您需要的complete.case 的否定:

      一个逻辑向量,指定哪些观察/行在整个序列中没有缺失值。

      df <- data.frame(ID = c("12","12","12","13","13","14","14"), 
                       Q1 = c(NA,"b",NA,"b",NA,"a","a"), 
                       Q2 = c(NA,"a",NA,"b",NA,"a","b"), 
                       Q3 = c(NA,"a",NA,"a",NA,"b","b"))
      
      
      df[!complete.cases(df),1]
      #> [1] "12" "12" "13"
      
      
      microbenchmark::microbenchmark(df[which(rowSums(is.na(df[,-1]))>0),1],df[!complete.cases(df),1])
      #> Unit: microseconds
      #>                                        expr  min   lq   mean median   uq   max
      #>  df[which(rowSums(is.na(df[, -1])) > 0), 1] 30.0 31.2 36.600   31.7 32.5 249.4
      #>                  df[!complete.cases(df), 1]  7.2  7.8  9.345    8.1  8.5  39.9
      #>  neval cld
      #>    100   b
      #>    100  a
      

      reprex package (v0.3.0) 于 2020 年 9 月 10 日创建

      速度也快了四倍

      【讨论】:

        猜你喜欢
        • 2014-12-22
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 2021-01-30
        • 2015-05-12
        • 2021-06-27
        相关资源
        最近更新 更多