多变量字符串数字提取问询:批量处理pre/post前缀变量方案
批量提取调查数据中pre/post开头变量的数字前缀
需求说明
- 调查数据响应以数字开头(如
"1-Agree"、"1-Acceurdo"),需提取仅保留数字部分 - 目标变量均以
pre或post开头,需批量处理 - 部分变量为多选格式(如
"1-Doctor, 2-Nurse, 6-Hospital"),需先拆分选项再提取数字
解决方案(R语言)
1. 定义数字提取函数
先写一个通用函数,兼容单选/多选格式,提取所有数字并保留逗号分隔的结构:
library(tidyverse) extract_numeric_prefix <- function(x) { if (is.na(x)) return(NA) # 拆分多选选项(匹配逗号+任意空格) options <- str_split(x, ",\\s+", simplify = TRUE) # 提取每个选项开头的连续数字 numeric_vals <- str_extract(options, "^\\d+") # 用逗号拼接结果,和原格式对齐 paste(numeric_vals, collapse = ", ") }
2. 批量处理目标变量
筛选所有以pre/post开头的变量,批量应用提取函数:
# 匹配目标变量名(忽略大小写) target_vars <- grep("^(pre|post)", names(df), ignore.case = TRUE, value = TRUE) # 批量更新变量 df <- df %>% mutate(across(all_of(target_vars), extract_numeric_prefix))
3. 可选:将多选拆分为多列
如果需要把多选结果拆分成独立列(如原示例中的Pre3[,1]、Pre3[,2]),可以按以下步骤处理:
# 先统计所有目标变量的最大选项数 max_option_count <- df %>% select(all_of(target_vars)) %>% mutate(across(everything(), ~str_count(., ",") + 1)) %>% max(na.rm = TRUE) # 定义拆分提取函数 split_extract <- function(x) { if (is.na(x)) return(rep(NA, max_option_count)) options <- str_split(x, ",\\s+", simplify = TRUE) numeric_vals <- str_extract(options, "^\\d+") # 补齐NA到最大长度 length(numeric_vals) <- max_option_count numeric_vals } # 批量拆分并生成新列 split_columns <- df %>% select(all_of(target_vars)) %>% mutate(across(everything(), split_extract)) %>% unnest_wider(everything(), names_sep = "_") # 合并回原数据框 df <- bind_cols(df, split_columns)
内容的提问来源于stack exchange,提问作者simone96
相关产品推荐
相关产品推荐

