如何用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.
相关产品推荐
相关产品推荐

