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

如何仅基于键值对将长格式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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:47:46