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

如何用dplyr判断数据框指定列每行非NA值是否全部相等?

解决方案

首先需要注意原数据框中c4列的第四个值是字符串"NA",而非R原生的缺失值NA,需先将其转换为真正的缺失值再进行判断。以下是使用dplyr实现的代码:

library(dplyr)

# 转换字符串"NA"为原生NA,并生成判断列
df <- df %>%
  # 将c3、c4中的"NA"字符串转为缺失值
  mutate(across(c(c3, c4), ~ ifelse(.x == "NA", NA_character_, .x))) %>%
  # 按行处理,计算非NA值的唯一数量是否为1
  rowwise() %>%
  mutate(all_equal = n_distinct(c(c2, c3, c4), na.rm = TRUE) == 1) %>%
  ungroup()

# 查看结果
print(df)

运行后输出结果:

# A tibble: 4 × 5
  c1    c2    c3    c4    all_equal
  <chr> <chr> <chr> <chr> <lgl>    
1 l     a     b     a     FALSE    
2 m     a     NA    a     TRUE     
3 n     a     a     a     TRUE     
4 o     a     b     NA    FALSE    

替代方案(无需rowwise)

如果担心rowwise的效率问题,可使用purrr的pmap_lgl函数实现:

library(dplyr)
library(purrr)

df <- df %>%
  mutate(across(c(c3, c4), ~ ifelse(.x == "NA", NA_character_, .x))) %>%
  mutate(all_equal = pmap_lgl(list(c2, c3, c4), 
                             ~ n_distinct(c(...), na.rm = TRUE) == 1))

逻辑说明

  • 转换字符串"NA"为原生NA:确保后续缺失值判断准确。
  • n_distinct(..., na.rm = TRUE):计算每行指定列中非NA值的唯一值数量,若数量为1则说明所有非NA值完全相等,返回TRUE,否则返回FALSE。

内容的提问来源于stack exchange,提问作者Ben S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:42:23