You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用简洁语法筛选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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:10:29