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

在R中将长格式数据转宽格式:扩展为多列的技术问询

嘿,这个长格式转宽格式的需求在数据处理里太普遍了!我给你准备了Python(Pandas)和R(tidyr)两种主流工具的实现方案,直接上手就能用:

Python 实现(基于Pandas)

Pandas的pivot或pivot_table函数完美适配这个场景,步骤如下:

  1. 先导入库并构造你的示例数据:
import pandas as pd

# 构造示例长格式数据
long_data = pd.DataFrame([
    [1, 1, 'A', 'County', 1, 'county1'],
    [1, 1, 'A', 'County', 2, 'county2'],
    [1, 1, 'A', 'source1', 1, 9],
    [1, 1, 'A', 'source1', 2, 4],
    [1, 1, 'A', 'source2', 1, 7],
    [1, 1, 'A', 'source2', 2, 2],
    [2, 1, 'B', 'County', 1, 'county1'],
    [2, 1, 'B', 'County', 2, 'county1'],
    [2, 1, 'B', 'source1', 1, 21],
    [2, 1, 'B', 'source1', 2, 9],
    [2, 1, 'B', 'source2', 1, 4],
    [2, 1, 'B', 'source2', 2, 7]
], columns=['id', 'year', 'facname', 'class_code', 'line_no', 'value'])
  1. 使用pivot转换为宽格式:
wide_data = long_data.pivot(
    index=['id', 'year', 'facname', 'line_no'],
    columns='class_code',
    values='value'
).reset_index()

# 整理列名(移除多级索引的层级名称)
wide_data.columns.name = None
  1. 输出结果就是你要的宽格式:
id  year facname  line_no  County source1 source2
0   1     1       A        1  county1       9       7
1   1     1       A        2  county2       4       2
2   2     1       B        1  county1      21       4
3   2     1       B        2  county1       9       7

小提示:如果你的数据存在同一个id+year+facname+line_no+class_code组合对应多个value的情况,改用pivot_table并指定aggfunc(比如aggfunc='mean'或aggfunc='sum')来聚合重复值。


R 实现(基于tidyr)

R的tidyr包提供了pivot_wider函数,专门处理长转宽,步骤同样清晰:

  1. 加载库并构造示例数据:
library(tidyr)

# 构造示例长格式数据框
long_data <- data.frame(
  id = c(1,1,1,1,1,1,2,2,2,2,2,2),
  year = rep(1,12),
  facname = c(rep('A',6), rep('B',6)),
  class_code = c('County','County','source1','source1','source2','source2',
                 'County','County','source1','source1','source2','source2'),
  line_no = c(1,2,1,2,1,2,1,2,1,2,1,2),
  value = c('county1','county2',9,4,7,2,'county1','county1',21,9,4,7)
)
  1. 使用pivot_wider转换:
wide_data <- long_data %>%
  pivot_wider(
    id_cols = c(id, year, facname, line_no),
    names_from = class_code,
    values_from = value
  )
  1. 查看结果:
print(wide_data)
#>   id year facname line_no County source1 source2
#> 1  1    1       A       1 county1       9       7
#> 2  1    1       A       2 county2       4       2
#> 3  2    1       B       1 county1      21       4
#> 4  2    1       B       2 county1       9       7

小提示:如果有重复值,添加values_fn参数来指定聚合方式,比如values_fn = mean。


内容的提问来源于stack exchange,提问作者Anurag Kaushik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:40:51