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

R语言批量创建多变量求助:基于后缀匹配复用逻辑

批量生成带后缀的fruit变量解决方案

针对你需要基于kiwi_*和apple_*变量批量生成对应后缀fruit_*的需求,这里提供两种可行的tidyverse方案,适配复杂的case_when逻辑:

方法一:长格式转换法(推荐,逻辑只需写一次)

这种方法通过将宽格式数据转为长格式,统一处理逻辑后再转回宽格式,适合逻辑复杂、后缀较多的场景:

library(dplyr)
library(tidyr)

# 初始数据框
dat <- data.frame(
  kiwi_3 = c(1,0,1),
  kiwi_5 = c(0,0,1),
  kiwi_8 = c(1,1,0),
  apple_3 = c(0,0,0),
  apple_5 = c(1,0,1),
  apple_8 = c(1,1,0)
)

# 转换为长格式,按后缀分组处理
dat_processed <- dat %>%
  # 将变量拆分为类型(kiwi/apple)和后缀数字
  pivot_longer(
    everything(),
    names_to = c(".value", "suffix"),
    names_pattern = "(.*)_(\\d+)"  # 正则匹配变量名前缀和后缀
  ) %>%
  # 统一编写fruit的case_when逻辑,只需写一次
  mutate(
    fruit = case_when(
      kiwi == 1 & apple == 1 ~ 1,
      kiwi == 1 & apple == 0 ~ 2,
      # 可根据实际需求添加更多条件,比如其他情况的默认值
      TRUE ~ NA_real_
    )
  ) %>%
  # 转回宽格式,生成带后缀的fruit_*变量
  pivot_wider(
    names_from = suffix,
    values_from = c(kiwi, apple, fruit),
    names_sep = "_"
  )

关键说明:

  • names_pattern = "(.*)_(\\d+)":用正则表达式将变量名拆分为两部分,(.*)匹配前缀(kiwi/apple),(\\d+)匹配数字后缀;
  • .value:指定长格式中对应原变量前缀的列名,保留kiwi和apple的数值;
  • 逻辑只需在mutate(fruit=...)中编写一次,自动应用到所有后缀组。

方法二:循环遍历后缀法

如果不想转换数据格式,可以通过提取后缀列表,循环遍历每个后缀生成对应fruit变量:

library(dplyr)
library(purrr)
library(stringr)

# 初始数据框
dat <- data.frame(
  kiwi_3 = c(1,0,1),
  kiwi_5 = c(0,0,1),
  kiwi_8 = c(1,1,0),
  apple_3 = c(0,0,0),
  apple_5 = c(1,0,1),
  apple_8 = c(1,1,0)
)

# 提取所有唯一的数字后缀
suffixes <- stringr::str_extract(names(dat), "(?<=_)\\d+") %>% 
  unique() %>% 
  na.omit()

# 遍历每个后缀,批量生成fruit_*变量
dat_processed <- dat %>%
  purrr::reduce(
    suffixes,
    function(df, suf) {
      df %>%
        mutate(
          # 用!!sym()将字符串转为变量名
          !!sym(paste0("fruit_", suf)) := case_when(
            !!sym(paste0("kiwi_", suf)) == 1 & !!sym(paste0("apple_", suf)) == 1 ~ 1,
            !!sym(paste0("kiwi_", suf)) == 1 & !!sym(paste0("apple_", suf)) == 0 ~ 2,
            TRUE ~ NA_real_
          )
        )
    },
    .init = .
  )

关键说明:

  • str_extract提取变量名中的数字后缀;
  • !!sym():将拼接的字符串(如"kiwi_3")转为可识别的变量名,实现动态变量引用;
  • reduce用于串联每个后缀对应的mutate操作,逐步添加新变量。

两种方法都能满足批量生成需求,方法一更适合维护复杂逻辑,方法二保留原数据宽格式结构。

内容的提问来源于stack exchange,提问作者lemnbalm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:15:48