【问题标题】:Select groups where all values are larger than x选择所有值都大于 x 的组
【发布时间】:2022-08-04 03:13:53
【问题描述】:

我有一个按“主题”分组的数据框。我想过滤那些所有 \'values\' 都高于某个值的 \'subject\',values > 0.5

示例 df:

df1 <- data.frame(subject = c(1, 2, 3, 4, 5, 1, 2, 3, 4, 5),
                   values = c(.4, .6, .6, .6, .6, .6, .6, .6, .6, .4))
df1
   subject values
1        1    0.4
2        2    0.6
3        3    0.6
4        4    0.6
5        5    0.6
6        1    0.6
7        2    0.6
8        3    0.6
9        4    0.6
10       5    0.4

期望的输出:

> df1
  subject values
1       2    0.6
2       3    0.6
3       4    0.6
4       2    0.6
5       3    0.6
6       4    0.6

    标签: r filter


    【解决方案1】:

    您可以使用 dplyr 在分组过滤器中使用 all()

    library(dplyr)
    
    df1 %>%
      group_by(subject) %>%
      filter(all(values > .5)) %>%
      ungroup()
    

    输出:

    # A tibble: 6 x 2
      subject values
        <dbl>  <dbl>
    1       2    0.6
    2       3    0.6
    3       4    0.6
    4       2    0.6
    5       3    0.6
    6       4    0.6
    

    【讨论】:

      【解决方案2】:

      ave 中使用min

      df1[with(df1, ave(values, subject, FUN=min)) > .5, ]
      #   subject values
      # 2       2    0.6
      # 3       3    0.6
      # 4       4    0.6
      # 7       2    0.6
      # 8       3    0.6
      # 9       4    0.6
      

      【讨论】:

        【解决方案3】:

        data.table 方法

        library(data.table_)
        setDT(df1)[, .SD[all(values == 0.6) == TRUE], by = .(subject)][]
        #    subject values
        # 1:       2    0.6
        # 2:       2    0.6
        # 3:       3    0.6
        # 4:       3    0.6
        # 5:       4    0.6
        # 6:       4    0.6
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-21
          • 2012-08-10
          • 1970-01-01
          • 2016-02-03
          • 2020-10-10
          相关资源
          最近更新 更多