如何用简洁语法筛选tidyverse中多列值相同的数据行?
筛选指定列集合值全相同的行
先给出示例数据:
library(tidyverse) d = data.frame(x=c('A','B','C'), y=c('A','B','D'), z=c('X','B','C'), a=1:3) print(d) # x y z a # 1 A A X 1 # 2 B B B 2 # 3 C D C 3
以下是几种简洁的实现方式,适用于任意列集合:
方法1:rowwise() + n_distinct()
通过判断每行目标列的不同值数量是否为1,来筛选所有值相同的行:
# 筛选x、y、z列值全相同的行 d %>% rowwise() %>% filter(n_distinct(c(x, y, z)) == 1) %>% ungroup() # 输出结果: # # A tibble: 1 × 4 # x y z a # <chr> <chr> <chr> <int> # 1 B B B 2 # 若要筛选其他列集合,比如x和z,只需修改c(x,z): d %>% rowwise() %>% filter(n_distinct(c(x, z)) == 1) %>% ungroup()
方法2:across() + reduce()
用across()选中目标列,再通过reduce()将列间的相等条件逐一合并:
d %>% filter(reduce(across(c(x, y, z)), `==`))
方法3:if_all()(dplyr 1.0.0+)
以某一列作为基准,检查所有目标列是否与基准列值相等:
# 以x为基准,检查y、z是否都等于x d %>% filter(if_all(c(y, z), ~ .x == x)) # 若列集合是y、z、a,可选择y作为基准(注意列类型需匹配) d %>% filter(if_all(c(z, a), ~ .x == y))
内容的提问来源于stack exchange,提问作者Ben S.
相关产品推荐
相关产品推荐

