使用R tidyverse的mutate、replace、unite折叠列 如何编写可复用函数?
多列标记合并解决方案
样本数据
| ID | B | C |
|---|---|---|
| 1 | NA | x |
| 2 | x | NA |
| 3 | x | x |
预期输出
| ID | Unified |
|---|---|
| 1 | C |
| 2 | B |
| 3 | B_C |
实现方法
你原有的实现逻辑是对的,仅需替换手动逐列替换的部分为dplyr内置的批量列处理函数across()即可适配100+列的场景,无需逐个编写变量规则:
library(tidyverse) Data %>% # 批量处理除ID外的所有列,值为x的替换为当前列名,否则保留NA mutate(across(-ID, ~ifelse(.x == "x", cur_column(), NA))) %>% # 合并除ID外的所有列,自动忽略NA值 unite("Unified", -ID, na.rm = TRUE, sep = "_")
代码说明
across(-ID):指定处理范围为除ID列外的所有列,你也可以使用starts_with()、matches()等列选择器灵活限定处理范围cur_column():自动获取当前正在处理的列名,无需手动指定列名常量unite()参数sep = "_"指定多值拼接的分隔符,可根据需求调整
如果需要复用该逻辑,可以封装为独立函数:
# 自定义函数,支持自定义ID列、输出列名、分隔符 unify_flag_columns <- function(data, id_col = "ID", output_col = "Unified", sep = "_") { data %>% mutate(across(-{{ id_col }}, ~ifelse(.x == "x", cur_column(), NA))) %>% unite({{ output_col }}, -{{ id_col }}, na.rm = TRUE, sep = sep) } # 调用示例 result <- unify_flag_columns(Data)
内容的提问来源于stack exchange,提问作者cellist_by_night
相关产品推荐
相关产品推荐

