基于多个不同组的多个不同值的过滤器df

问题描述 投票:1回答:2

示例数据:

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
2个回答
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
> 

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
© www.soinside.com 2019 - 2024. All rights reserved.