R语言:编写函数批量处理物质使用数据的变量重编码
高效处理物质使用数据集的重编码方案
核心思路
抛弃繁琐的if-else分支,用tidyverse的宽转长+长转宽流程批量处理,既能简洁实现需求,又能轻松扩展,同时完全保留原数据并生成目标变量。
步骤1:准备示例测试数据
先模拟符合结构的数据集,方便验证代码:
library(tidyverse) set.seed(123) sample_data <- tibble( id = 1:5, # sub1组变量 sub1_value = sample(c("Alcohol", "Tobacco", "Cannabis"), 5, replace = TRUE), sub1_day1 = sample(0:5, 5, replace = TRUE), sub1_day2 = sample(0:5, 5, replace = TRUE), # sub2组变量 sub2_value = sample(c("Alcohol", "Tobacco", "Cannabis"), 5, replace = TRUE), sub2_day1 = sample(0:5, 5, replace = TRUE), sub2_day2 = sample(0:5, 5, replace = TRUE), # sub3-sub6组变量(示例简化,实际可扩展至6组) sub3_value = sample(c("Alcohol", "Tobacco", "Cannabis"), 5, replace = TRUE), sub3_day1 = sample(0:5, 5, replace = TRUE), sub3_day2 = sample(0:5, 5, replace = TRUE) )
步骤2:批量重编码函数实现
编写通用函数,自动识别subN开头的变量,完成格式转换:
recode_substance_data <- function(data, n_subs = 6, days = 7) { # 生成sub变量前缀列表 sub_prefixes <- str_c("sub", 1:n_subs) # 第一次宽转长:拆分每个sub组的物质名称与每日使用量 long_data <- data %>% pivot_longer( cols = starts_with("sub"), names_to = c("sub", ".value"), names_pattern = "(sub\\d+)_(.*)" ) # 第二次宽转长+转宽:生成按物质命名的每日使用量变量 wide_new_vars <- long_data %>% pivot_longer( cols = starts_with("day"), names_to = "day", values_to = "usage" ) %>% mutate( # 生成目标变量名:统一为dayX_物质小写格式 new_var = str_c(day, "_", tolower(value)) ) %>% pivot_wider( id_cols = id, names_from = new_var, values_from = usage, values_fill = 0 # 缺失使用量补0,可按需调整 ) # 合并原数据与新生成变量,保留所有原始内容 final_data <- data %>% left_join(wide_new_vars, by = "id") return(final_data) }
步骤3:函数调用与结果验证
直接传入数据集即可,默认处理6个sub变量和7天数据,可按需调整参数:
# 示例处理3个sub变量、2天数据 processed_data <- recode_substance_data(sample_data, n_subs = 3, days = 2) # 查看结果:原数据列 + day1_alcohol、day1_tobacco等新列 glimpse(processed_data)
方案优势
- 彻底消除重复代码,无需逐个sub写判断逻辑
- 支持任意数量的sub变量(1-6或更多)和天数(7天或其他周期)
- 自动统一物质名称为小写,避免大小写不一致导致的变量混乱
- 完整保留原始数据,仅新增目标变量,不破坏原有结构
内容的提问来源于stack exchange,提问作者uncertaincyclist
相关产品推荐
相关产品推荐

