【问题标题】:drop levels of factor for which there is one missing value for one column r删除一列 r 有一个缺失值的因子水平
【发布时间】:2014-12-18 19:47:12
【问题描述】:

我想删除任何出现的某一行包含缺失值的因子水平

例子:

ID var1 var2
1  1    2
1  NA   3
2  1    2
2  2    4

所以,在这个假设中,剩下的将是:

ID var1 var2
2  1    2
2  2    4

【问题讨论】:

    标签: r


    【解决方案1】:

    她可能的data.table 解决方案(对不起@rawr)

    library(data.table)
    setDT(df)[, if (all(!is.na(.SD))) .SD, ID]
    #    ID var1 var2
    # 1:  2    1    2
    # 2:  2    2    4
    

    如果你只想查看var1 那么

    df[, if (all(!is.na(var1))) .SD, ID]
    #    ID var1 var2
    # 1:  2    1    2
    # 2:  2    2    4
    

    【讨论】:

      【解决方案2】:

      假设NAs 会同时出现在var 列中,

       df[with(df, !ave(!!rowSums(is.na(df[,-1])), ID, FUN=any)),]
       #   ID var1 var2
       #3  2    1    2
       #4  2    2    4
      

      或者如果它只特定于var1

       df[with(df, !ave(is.na(var1), ID, FUN=any)),]
       #  ID var1 var2
       #3  2    1    2
       #4  2    2    4
      

      或使用dplyr

       library(dplyr)
       df %>% 
           group_by(ID) %>%
           filter(all(!is.na(var1)))
       #   ID var1 var2
       #1  2    1    2
       #2  2    2    4
      

      数据

       df <- structure(list(ID = c(1L, 1L, 2L, 2L), var1 = c(1L, NA, 1L, 2L
       ), var2 = c(2L, 3L, 2L, 4L)), .Names = c("ID", "var1", "var2"
       ), class = "data.frame", row.names = c(NA, -4L))
      

      【讨论】:

        【解决方案3】:

        这是 base R 中的另一个选项。它将检查所有列的 NA。

        df[!df$ID %in% df$ID[rowSums(is.na(df)) > 0],]
        #  ID var1 var2
        #3  2    1    2
        #4  2    2    4
        

        如果您只想检查“var1”列,您可以这样做:

        df[!with(df, ID %in% ID[is.na(var1)]),]
        #  ID var1 var2
        #3  2    1    2
        #4  2    2    4
        

        【讨论】:

          【解决方案4】:

          data.table 的当前开发版本中,data.tables 有一个新的na.omit 实现,它接受cols =invert = 参数。

          cols = 允许指定要在其上查找NAs 的列。而invert = TRUE 则返回 NA 行,而不是省略它们

          您可以安装开发版by following these instructions。或者您可以在某个时候在 CRAN 上等待 1.9.6。使用它,我们可以这样做:

          require(data.table) ## 1.9.5+
          setkey(setDT(df), ID)
          df[!na.omit(df, invert = TRUE)]
          #    ID var1 var2
          # 1:  2    1    2
          # 2:  2    2    4
          

          这是如何工作的:

          • setDT通过引用将data.frame转换为data.table。

          • setkey 按提供的列对 data.table 进行排序,并将这些列标记为 键列,以便我们可以执行连接。

          • na.omit(df, invert = TRUE) 只给出那些在任何地方都有NA 的行。

          • X[!Y] 通过加入键列ID 进行反连接,并返回所有与ID = 1 不匹配的行(来自Y)。查看this post 详细了解 data.table 的连接。

          HTH

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多