使用purrr实现多列多映射的批量重编码
优化问卷数据重编码的purrr方案
问题场景
现有一份问卷响应数据框,其中以qa和qb开头的列分别共享相同的答案编码规则。目前通过手动编写多个across()调用完成重编码,但希望用purrr实现迭代式批量处理,减少重复代码。
原始数据与编码规则
library(tidyverse) set.seed(42) # 问卷响应数据框 data_df <- tibble( qa_1 = sample(c(0, 1), 5, replace = TRUE), qa_2 = sample(c(0, 1), 5, replace = TRUE), qb_1 = sample(1:5, 5, replace = TRUE), qb_3 = sample(1:5, 5, replace = TRUE) ) # 存储编码规则的tibble(answer列以字符串形式存储recode参数) recode_df <- tibble( question = c("qa", "qb"), answer = c( 'c("0" = "foo0", "1" = "foo1")', 'c("1" = "bar1", "2" = "bar2", "3" = "bar3", "4" = "bar5", "5" = "bar5")' ) )
优化后的purrr解决方案
利用purrr::map2遍历编码规则表的每一行,自动生成对应前缀列的重编码逻辑,最后通过!!!解包到mutate中完成批量处理:
data_df %>% mutate( !!!map2(recode_df$question, recode_df$answer, ~across(starts_with(.x), ~recode(., !!!eval(parse(text = .y))))) )
输出结果
# A tibble: 5 x 4 qa_1 qa_2 qb_1 qb_3 <chr> <chr> <chr> <chr> 1 foo0 foo1 bar5 bar2 2 foo0 foo1 bar1 bar3 3 foo0 foo1 bar5 bar1 4 foo0 foo0 bar5 bar1 5 foo1 foo1 bar2 bar3
方案说明
map2会逐个匹配recode_df中的question前缀和对应的answer编码字符串,为每组前缀生成独立的across重编码逻辑!!!用于解包map2生成的列表,将所有across调用传递给mutate,实现一次完成所有列的重编码- 这种方式无需手动为每个前缀编写重复的
across代码,当编码规则表新增行时,代码会自动适配新的前缀列
内容的提问来源于stack exchange,提问作者Claudiu Papasteri
相关产品推荐
相关产品推荐

