R语言如何对字符串向量中逗号分隔的变量名动态求值生成列值
R中mutate动态匹配逗号分隔列名取值的实现方法
问题复现
测试用源数据如下:
df <- data.frame( Date1 = as.Date(c("2010-09-10", "2015-12-03")), Date2 = as.Date(c("2012-09-10", "2016-12-03")), Selected = c("Date1", "Date1, Date2") )
目标是生成Value列:当Selected为单个列名时取对应列的行值,当Selected为逗号分隔的多个列名时,把所有对应列的行值用逗号拼接,最终效果如下:
Date1 Date2 Selected Value 1 2010-09-10 2012-09-10 Date1 2010-09-10 2 2015-12-03 2016-12-03 Date1, Date2 2015-12-03, 2016-12-03
单值场景用get()可以实现,但多列名场景无法直接用get()处理,可通过行级迭代的方案兼容两种场景。
实现代码
依赖dplyr和purrr实现,不需要硬编码判断列名数量,自动适配任意个逗号分隔的列名:
library(dplyr) library(purrr) df <- df %>% rowwise() %>% mutate( Value = strsplit(Selected, ", ")[[1]] |> map_chr(~ as.character(cur_data()[[.x]])) |> paste(collapse = ", ") ) %>% ungroup()
逻辑说明
- 用
rowwise()开启行级运算模式,保证后续操作逐行执行 - 每一行先通过
strsplit(Selected, ", ")把逗号拼接的列名拆成独立的字符向量,自动适配1个或多个列名的情况 - 用
map_chr()遍历拆分后的每个列名,通过cur_data()获取当前行的数据集,用列名索引取值,统一转成字符格式避免日期类数据拼接报错 - 取到所有值后用
paste()加,做分隔符拼接成目标字符串 - 最后用
ungroup()退出行式运算模式,回到常规数据框状态
运行后得到的结果和预期完全一致,不需要针对单/多列名写单独的分支判断。
内容的提问来源于stack exchange,提问作者karuno
相关产品推荐
相关产品推荐

