R语言使用spread/pivot_wider将含多类型数据的长表转换为宽表
R语言长表转指定格式宽表实现方法
实现思路
使用tidyr包的pivot_wider函数实现,该函数支持同时指定多个待展开的字段,且支持自定义列名格式,完美适配需求。spread为旧版函数,实现多字段展开需要额外嵌套处理,优先推荐pivot_wider方案。
完整实现代码
首先加载依赖包,再执行转换:
# 加载依赖(如果未安装先执行 install.packages("tidyr") 安装) library(tidyr) # 构造示例数据集 tst <- data.frame(ID = c(123, 123, 123, 124, 124, 124), Identifier = c("S2", "S2", "S5", "S3", "S2", "S2"), Speed = c(15,24,11,34,13,15), Box_loc = c(801,802,803,801,802,803), Ord = c(86,87,90,81,82,84)) # 长转宽操作 tst_wide <- pivot_wider( data = tst, id_cols = ID, # 行唯一标识字段 names_from = Box_loc, # 用作列名后缀的字段 values_from = c(Identifier, Speed, Ord), # 待展开的字段,有多少加多少即可 names_glue = "{.value}({Box_loc})" # 自定义列名格式,匹配需求的 字段名(Box_loc值) 结构 )
结果验证
运行后输出的tst_wide结构完全符合需求:
| ID | Identifier(801) | Speed(801) | Ord(801) | Identifier(802) | Speed(802) | Ord(802) | Identifier(803) | Speed(803) | Ord(803) |
|---|---|---|---|---|---|---|---|---|---|
| 123 | S2 | 15 | 86 | S2 | 24 | 87 | S5 | 11 | 90 |
| 124 | S3 | 34 | 81 | S2 | 13 | 82 | S2 | 15 | 84 |
扩展说明
如果待展开字段有10个,仅需要将所有待展开字段名添加到values_from参数的向量中即可,其余逻辑不需要调整,适配ID范围123~250的全量数据集。
内容的提问来源于stack exchange,提问作者Duba Minus
相关产品推荐
相关产品推荐

