R语言中基于dplyr包,利用预定义node对象匹配目标列并新增对应列的实现求助
解决方案:动态新增匹配列的一行代码实现
我来帮你搞定这个问题!你的需求很明确:根据node变量的值,找到数据框中对应的{node}_Class列(这里就是L1_Class),然后新增一列{node}(这里是L1),让它和目标列的内容完全一致,而且要一行代码完成。
问题出在哪?
你之前尝试的代码用了across,但across的作用是对多列应用函数并返回子数据框,而你只需要单一列的向量,所以直接用across会导致把整个子数据框赋值给新列,自然达不到预期效果。
正确的一行代码写法
这里有两种简洁的可行写法,都能满足你的需求:
写法1:使用.data代词 + tidyeval
dat <- dat %>% mutate(!!node := .data[[paste0(node, "_Class")]])
写法2:使用sym()明确转换为符号
dat <- dat %>% mutate(!!sym(node) := .data[[paste0(node, "_Class")]])
代码解释
paste0(node, "_Class"):动态拼接出我们需要匹配的目标列名,这里node是"L1",所以拼接后就是"L1_Class".data[[colname]]:dplyr中安全引用数据框列的方式,避免和环境中的变量名冲突!!node/!!sym(node):这是tidyeval语法,用来把node的字符串值作为新列的名称,实现动态命名新列
测试验证
运行上面的代码后,查看head(dat)就能看到新增的L1列和L1_Class列内容完全一致,和你手动赋值dat$L1 <- dat$L1_Class的效果一模一样。
内容的提问来源于stack exchange,提问作者user15787999
相关产品推荐
相关产品推荐

