示例数据:
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?
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
>
我将使用旧的拆分-应用-合并方法:
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