如何获取数据框中b、c、e列值不全相等(忽略NA)的行索引
解决方案:筛选指定列值不全相等(忽略NA)的行
首先构造示例数据框:
library(dplyr) d <- tibble::tribble( ~a, ~b, ~c, ~d, ~e, 1, "x", "x", "A", "x", 2, "y", "y", "A", NA, 3, "z", "v", "B", NA, 4, "x", "w", "T", "w", 5, "s", NA, "K", NA )
方法一:使用rowwise() + n_distinct()
核心逻辑是:对每行的b、c、e列,忽略NA后统计去重值的数量,若数量大于1则说明值不全相等,保留该行。
d %>% rowwise() %>% filter(n_distinct(c_across(c(b, c, e)), na.rm = TRUE) > 1) %>% ungroup()
运行后会得到目标行(行3、行4):
# A tibble: 2 × 5 a b c d e <dbl> <chr> <chr> <chr> <chr> 1 3 z v B NA 2 4 x w T w
方法二:使用purrr::pmap_lgl()(无需行分组)
通过逐行映射计算去重值数量,同样实现筛选:
library(purrr) d %>% filter(pmap_lgl(select(., b, c, e), ~ n_distinct(c(...), na.rm = TRUE) > 1))
结果与方法一完全一致。
原代码的问题分析
你之前的代码filter(if_all(c(c,e), ~ b == .b))存在两个问题:
- 逻辑方向错误:该代码是筛选
c、e都等于b的行,而我们需要的是筛选值不全相等的行; - NA处理缺陷:
NA == 任意值的结果是NA,filter会自动排除含NA的行,导致无法正确识别像行2这种含NA但其余值相等的情况。
内容的提问来源于stack exchange,提问作者user21508369
相关产品推荐
相关产品推荐

