示例数据:
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?
答案 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