R语言使用dplyr根据数据框其余列字符串值新建判断列
dplyr实现逐行判断列值一致性新增列
需求背景
现有名为my_df的数据框,构造代码如下:
my_df <- structure(list(C1 = c("A", "X", "X", "A", "A"), F2 = c("A", "A", "A", "A", "A"), T3 = c("A", "A", "X", "X", "A"), S4 = c("A", "A", "A", "A", "X"), B5 = c("A", "A", "A", "A", "A")), class = "data.frame", row.names = c("ID1", "ID2", "ID3", "ID4", "ID5"))
原始数据预览:
> my_df C1 F2 T3 S4 B5 ID1 A A A A A ID2 X A A A A ID3 X A X A A ID4 A A X A A ID5 A A A X A
需要新增列new_col:逐行判断,若该行所有列取值完全一致则取值为same,否则取值为diff,期望输出效果如下:
> my_df C1 F2 T3 S4 B5 new_col ID1 A A A A A same ID2 X A A A A diff ID3 X A X A A diff ID4 A A X A A diff ID5 A A A X A diff
实现方案
写法1:易读性优先(推荐小数据集使用)
用dplyr原生的逐行操作语法,逻辑清晰易维护:
library(dplyr) my_df <- my_df %>% rowwise() %>% mutate( new_col = if_else( n_distinct(c_across(everything())) == 1, "same", "diff" ) ) %>% ungroup()
逻辑说明:
rowwise()将数据按行分组,后续计算逐行执行c_across(everything())提取当前行所有列的取值,合并为一维向量n_distinct()统计向量内唯一值的数量,等于1即代表该行所有值完全相同- 最后用
ungroup()解除行分组,避免干扰后续数据操作
写法2:性能优先(推荐大数据集使用)
跳过行分组的开销,用向量化的apply实现逐行判断,运行速度更快:
library(dplyr) my_df <- my_df %>% mutate( new_col = if_else( apply(cur_data(), 1, \(x) n_distinct(x) == 1), "same", "diff" ) )
两种写法运行后得到的结果完全匹配预期输出。
内容的提问来源于stack exchange,提问作者icedcoffee
相关产品推荐
相关产品推荐

