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

如何用另一DataFrame的标签-值对重编码整个DataFrame?(tidyverse方案)

问题

现有如下R语言数据框:

df <- data.frame(
  x = c("Yes","No","Yes","Don't Know"),
  y = c("Male","Female","Refused","Male"),
  z = c("Employed", "Unemployed","Employed","Employed")
)

需要通过另一个存储标签-值映射的数据框,将上述数据框的所有值重编码为数值:

codes <- data.frame(
  variable = c(rep("x",3),rep("y",3),rep("z",2)),
  labels = c("Yes","No","Don't Know","Male","Female","Refused","Employed", "Unemployed"),
  codes = c(1,2,98,1,2,99,1,2)
)

期望输出结果:

> df
   x  y z
1  1  1 1
2  2  2 2
3  1 99 1
4 98  1 1
tidyverse 解决方案

用dplyr和tidyr组合就能完成这个重编码需求,步骤如下:

  1. 先加载tidyverse包:
library(tidyverse)
  1. 执行重编码操作:
df_recode <- df %>%
  mutate(row_id = row_number()) %>%  # 加行号,避免转格式后丢失行顺序
  pivot_longer(-row_id, names_to = "variable", values_to = "labels") %>%  # 把宽表转成长表,方便匹配映射规则
  left_join(codes, by = c("variable", "labels")) %>%  # 根据变量名和标签匹配对应的编码
  select(row_id, variable, codes) %>%  # 只保留需要的列
  pivot_wider(names_from = "variable", values_from = "codes") %>%  # 转回宽表格式
  select(-row_id)  # 移除临时加的行号列

运行后df_recode就是目标结果:

> df_recode
# A tibble: 4 × 3
      x     y     z
  <dbl> <dbl> <dbl>
1     1     1     1
2     2     2     2
3     1    99     1
4    98     1     1

如果需要转为基础data.frame类型,再加as.data.frame(df_recode)即可。

内容的提问来源于stack exchange,提问作者Ahmad Noman Alnoor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:18:16