【问题标题】:r subset rows by criteria and by factor group按标准和因子组的 r 个子集行
【发布时间】:2016-08-08 12:13:00
【问题描述】:

我有这个带有很多 NA 的 data.frame:

df <- data.frame(a = rep(letters[1:3], each = 3), 
                 b = c(NA, NA, NA, 1, NA, 3, NA, NA, 7))
df
> df
  a  b
1 a NA
2 a NA
3 a NA
4 b  1
5 b NA
6 b  3
7 c NA
8 c NA
9 c  7

我想对该数据框进行子集化以仅获取具有不少于两个值的因子组行,例如:

  a  b
1 b 1
2 b NA
3 b 3

这个功能我试过了,还是不行:

subset(df, sum(!is.na(b)) < 1, by = a)

> [1] a b
<0 rows> (or 0-length row.names)

有什么建议吗? (欢迎使用其他软件包解决方案)

【问题讨论】:

    标签: r dataframe subset rows


    【解决方案1】:

    我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df)),按'a'分组,if逻辑向量的sum(即非NA元素-!is.na(b))大于1 ,然后对 Data.table 设置子集。

    library(data.table)
    setDT(df)[,if(sum(!is.na(b))>1) .SD , by = a]
    #   a  b
    #1: b  1
    #2: b NA
    #3: b  3
    

    或者使用dplyr,同样的逻辑,按'a'分组后,我们filter行。

    library(dplyr)
    df %>% 
        group_by(a) %>%
        filter(sum(!is.na(b))>1)
    #      a     b
    #  <fctr> <dbl>
    #1      b     1
    #2      b    NA
    #3      b     3
    

    或者在base Rave

    df[with(df, ave(b, a, FUN = function(x) sum(!is.na(x))>1)!=0),]
    

    【讨论】:

      【解决方案2】:

      一种方法是使用aggregate。计算每个唯一 a 中不是 NA 的元素的数量,然后从数据框中子设置这些行。

      agg <- aggregate(b~a, df, function(x) length(!is.na(x)) >= 2)
      df[df$a %in% agg[agg$b, "a"], ]
      
      #  a  b
      #4 b  1
      #5 b NA
      #6 b  3
      

      另一个选项是使用table

      df[df$a %in% names(which(table(df$a, is.na(df$b))[,1] > 1)), ]
      
      
      #  a  b
      #4 b  1
      #5 b NA
      #6 b  3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-20
        • 1970-01-01
        • 2018-09-23
        • 2020-08-08
        • 2014-01-09
        • 1970-01-01
        • 2016-09-12
        相关资源
        最近更新 更多