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

如何获取数据框中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))存在两个问题:

  1. 逻辑方向错误:该代码是筛选c、e都等于b的行,而我们需要的是筛选值不全相等的行;
  2. NA处理缺陷:NA == 任意值的结果是NA,filter会自动排除含NA的行,导致无法正确识别像行2这种含NA但其余值相等的情况。

内容的提问来源于stack exchange,提问作者user21508369

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:25:15