【问题标题】:Filter df based on multiple different values for multiple different groups根据多个不同组的多个不同值过滤 df
【发布时间】:2020-09-01 10:57:37
【问题描述】:

示例数据:

set.seed(99999)
library(dplyr)

Group <- c(rep("A",4),rep("B",4),rep("C",4))
Value <- abs(rnorm(12))
df <- data.frame(Group,Value)
df$Group <- as.character(df$Group)

我想根据“值”列中的不同值过滤每个组,即 A、B、C。在 dplyr 中它看起来像这样:

df2 <- df %>% 
  filter(Group=="A" & Value>=0.2 |
         Group=="B" & Value>=0.1 |
         Group=="C" & Value>=0.6)

但是,我的真实 df 大于 100 个组,并且每个组都有一个唯一的阈值来过滤。因此我有一个单独的 df3,它只有每组的阈值:

df3 <- data.frame(Group=c("A","B","C"),Value=c(0.2,0.1,0.6))

如何使用 df3 中每个相应组的相应阈值过滤 df?

【问题讨论】:

    标签: r filter dplyr subset


    【解决方案1】:

    dplyr 解决方案使用group_by(Group)inner_join() 按组合并阈值,然后使用filter() 保留Value 超过threshold 的行。

    set.seed(99999)
    library(dplyr)
    
    Group <- c(rep("A",4),rep("B",4),rep("C",4))
    Value <- abs(rnorm(12))
    df <- data.frame(Group,Value,stringsAsFactors = FALSE)
    df$Group <- as.character(df$Group)
    df3 <- data.frame(Group=c("A","B","C"),threshold=c(0.2,0.1,0.6),stringsAsFactors = FALSE)
    
    df %>% group_by(Group) %>%
       inner_join(df3) %>% filter(Value > threshold)
    

    请注意,我将df3 中的列名从Value 更改为threshold,以避免inner_join() 中的列名冲突。

    ...和输出:

    Joining, by = "Group"
    # A tibble: 9 x 3
    # Groups:   Group [3]
      Group Value threshold
      <chr> <dbl>     <dbl>
    1 A     0.426       0.2
    2 A     0.283       0.2
    3 A     0.899       0.2
    4 A     0.707       0.2
    5 B     2.09        0.1
    6 B     1.64        0.1
    7 B     0.540       0.1
    8 B     0.604       0.1
    9 C     0.956       0.6
    > 
    

    【讨论】:

      【解决方案2】:

      我会使用旧的拆分 - 应用 - 组合方法:

      library(dplyr)
      
      df %>%
        split(df$Group) %>%
        lapply(filter, Value > df3$Value[df3$Group == Group[1]]) %>%
        bind_rows()
      #>   Group     Value
      #> 1     A 0.4255127
      #> 2     A 0.2829203
      #> 3     A 0.8986773
      #> 4     A 0.7065184
      #> 5     B 2.0916699
      #> 6     B 1.6356643
      #> 7     B 0.5401934
      #> 8     B 0.6037287
      #> 9     C 0.9558980
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-13
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 2021-08-24
        • 2020-02-26
        相关资源
        最近更新 更多