如何创建函数批量对相同后缀的act1、wher列执行mutate生成新列
解决方案
可以实现,以下是两种常用实现方式:
方法1:tidyverse风格(across动态遍历,代码更简洁)
该方法利用dplyr的across()函数批量匹配相同后缀的列,无需手动写循环:
library(dplyr) library(stringr) # 定义单组列的转换逻辑 generate_new_col <- function(act_val, wher_val) { case_when( # 规则可直接简化:wher为Home时直接返回对应act值,无需逐个枚举活动类型 wher_val == "Home" ~ act_val # 如需补充其他wher场景的规则可在此处追加 ) } # 批量生成144个new_xx列 data <- data %>% mutate( across(starts_with("act1_"), .fns = ~ generate_new_col(.x, get(str_replace(cur_column(), "act1_", "wher_"))), .names = "new_{str_remove(.col, 'act1_')}") )
逻辑说明
- 自动遍历所有
act1_开头的列,通过列名字符串替换匹配对应同后缀的wher_列 - 新生成列自动按
new_数字后缀的格式命名,完全匹配需求
方法2:for循环实现(逻辑更直白,易调试)
如果更习惯基础循环写法,可以用动态变量注入的方式实现:
library(dplyr) library(rlang) for (i in 1:144) { # 构造当前组的三个列名 act_col <- paste0("act1_", i) wher_col <- paste0("wher_", i) new_col <- paste0("new_", i) # 动态注入列名生成新列 data <- data %>% mutate(!!sym(new_col) := case_when( !!sym(act_col) == "Bedroom" & !!sym(wher_col) == "Home" ~ "Bedroom", !!sym(act_col) == "Kitchen" & !!sym(wher_col) == "Home" ~ "Kitchen", !!sym(act_col) == "Lounge" & !!sym(wher_col) == "Home" ~ "Lounge", !!sym(act_col) == "Bathroom" & !!sym(wher_col) == "Home" ~ "Bathroom" )) }
逻辑说明
!!sym()用于将字符串格式的列名转换为dplyr可识别的列对象,:=用于动态给新列赋值- 如果你需要保留原始的逐个活动类型判断规则,直接用该方法即可,不需要修改逻辑
内容的提问来源于stack exchange,提问作者Loz
相关产品推荐
相关产品推荐

