根据多个不同组的多个不同值过滤df

时间:2020-05-15 14:59:49

标签: r filter dplyr subset

示例数据:

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?

2 个答案:

答案 0 :(得分:1)

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

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()

答案 1 :(得分:0)

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

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
相关问题