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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:22:46