如何在R中将长格式数据框转为宽格式,自定义新列名而非使用长变量值?
解决方案
你遇到的问题核心是spread()函数是将列的取值作为新列名,而你需要的是基于组内行的顺序生成新列,所以必须先给每个职业组内的雇主添加顺序标记,再转宽格式。
方法一:使用tidyverse(dplyr + tidyr)
先按职业代码分组,给每组内的行生成1-3的序号,再用pivot_wider(spread()的替代函数,功能更灵活)转成宽格式:
library(tidyverse) # 构造示例数据 df <- tibble( occcode = c(1,1,1,2,2,2), employer = c("occcode1的顶级雇主", "occcode1的第二雇主", "occcode1的第三雇主", "occcode2的顶级雇主", "occcode2的第二雇主", "occcode1的第三雇主") ) # 转换为宽格式 wide_df <- df %>% group_by(occcode) %>% # 给每个职业的雇主添加排名序号,生成employer1/2/3的列名前缀 mutate(emp_col = paste0("employer", row_number())) %>% ungroup() %>% # 按序号列拆分宽表 pivot_wider(names_from = emp_col, values_from = employer)
运行后得到的wide_df就是你想要的格式:
| occcode | employer1 | employer2 | employer3 |
|---|---|---|---|
| 1 | occcode1的顶级雇主 | occcode1的第二雇主 | occcode1的第三雇主 |
| 2 | occcode2的顶级雇主 | occcode2的第二雇主 | occcode1的第三雇主 |
方法二:使用data.table(适合大数据量)
如果你的数据量很大,用data.table的dcast效率更高:
library(data.table) setDT(df) wide_dt <- dcast(df, occcode ~ paste0("employer", rowid(occcode)), value.var = "employer")
关键逻辑
不管用哪种工具,核心都是先给每个occcode组内的行分配顺序标识符(1/2/3),再将这个标识符作为新列的名称,这样就不需要依赖雇主名称的标准化,完全基于组内的行顺序生成目标列。
内容的提问来源于stack exchange,提问作者C.K.
相关产品推荐
相关产品推荐

