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
相关产品推荐
相关产品推荐

