You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建函数批量对相同后缀的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:15:08