R语言数据框基于多列值变化新增存储首次变化列名的Switch列
实现逻辑
- 按行遍历所有列的取值,以该行第一列的数值为基准值
- 从第二列开始依次和基准值做比较,找到第一个取值和基准值不同的列,返回对应列名
- 若该行所有列取值都和基准值一致,返回NA
实现代码
Base R 版本
# 原始数据 DF <- data.frame(Col1=c(0,0,1),Col2=c(0,1,1),Col3=c(1,0,1)) # 新增Switch列 DF$Switch <- apply(DF, 1, function(row) { base_val <- row[1] # 定位第一个和基准值不同的列位置(跳过第一列) diff_idx <- which(row[-1] != base_val)[1] # 存在差异则返回对应列名,否则返回NA ifelse(is.na(diff_idx), NA_character_, names(row)[diff_idx + 1]) })
dplyr 版本
library(dplyr) DF <- DF %>% rowwise() %>% mutate(Switch = { row_vals <- c_across(everything()) base_val <- row_vals[1] diff_idx <- which(row_vals[-1] != base_val)[1] ifelse(is.na(diff_idx), NA_character_, names(row_vals)[diff_idx + 1]) }) %>% ungroup()
运行后输出结果和预期一致:
| Col1 | Col2 | Col3 | Switch |
|---|---|---|---|
| 0 | 0 | 1 | Col3 |
| 0 | 1 | 0 | Col2 |
| 1 | 1 | 1 | NA |
内容的提问来源于stack exchange,提问作者RNewbie
相关产品推荐
相关产品推荐

