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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:15:40