如何用另一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组合就能完成这个重编码需求,步骤如下:
- 先加载tidyverse包:
library(tidyverse)
- 执行重编码操作:
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
相关产品推荐
相关产品推荐

