如何仅基于键值对将长格式DataFrame转换为宽格式?
解决长格式DataFrame转宽格式(无固定列名)的问题
嘿,这个需求我之前处理过!针对你这种每个公司标签数量不固定的长表转宽表场景,你的思路完全正确——给每个公司的标签添加带编号的列作为宽表的列名,就能轻松实现转换了。下面我用R的dplyr和tidyr包给你具体演示步骤,亲测对8万行数据效率也没问题~
步骤1:模拟你的数据(方便演示)
先造一个和你数据结构一致的示例:
library(dplyr) library(tidyr) set.seed(123) # 固定随机结果,方便复现 df <- tibble( 公司名称 = rep(c("A公司", "B公司", "C公司"), c(3, 5, 2)), # 每个公司标签数量不同 标签 = sample(c("科技", "金融", "零售", "医疗"), 10, replace = TRUE) )
步骤2:为每个公司的标签添加序号列
用group_by()按公司分组,再用row_number()给组内的标签编序号,最后拼接成规范的列名(比如标签_1、标签_2):
df_with_index <- df %>% group_by(公司名称) %>% mutate(标签序号 = paste0("标签_", row_number())) %>% ungroup()
步骤3:转换为宽格式
用pivot_wider()(比旧版的spread()更灵活强大)完成转置,指定索引列、列名来源列和值来源列即可:
wide_df <- df_with_index %>% pivot_wider( id_cols = 公司名称, # 作为宽表行标识的列 names_from = 标签序号, # 作为宽表列名的列 values_from = 标签 # 填充宽表单元格的列 )
可选优化:处理空值
如果不想让没有标签的位置显示NA,可以用values_fill参数替换成空字符串或其他默认值:
wide_df <- df_with_index %>% pivot_wider( id_cols = 公司名称, names_from = 标签序号, values_from = 标签, values_fill = "" # 将NA替换为空字符串 )
这样处理后,你就能得到每个公司一行、标签按序号排列的宽格式DataFrame啦,完全适配你8万行的数据集~
内容的提问来源于stack exchange,提问作者pez
相关产品推荐
相关产品推荐

