如何将Eurostat包导入的数据集从长格式转换为宽格式?
问题原因与解决方案
你的pivot_wider结果不符合预期,核心原因是数据中存在重复的time+geo组合(比如示例数据里2022-12-01的EA19对应两个values值:68.3和-1.9),pivot_wider默认会把这些重复值打包成列表列,而非你预期的单一值列。
针对这个问题,分两种场景处理:
场景1:重复值对应不同统计指标(Eurostat原始数据特性)
Eurostat的sts_inpr_m数据集包含多种工业生产指数指标(比如总指数、环比变化、同比变化等),这些指标由indic_bt字段区分。你之前的代码删掉了这个字段,导致不同指标的数值被混在一起,出现重复的time+geo组合。
解决步骤:
- 重新导入数据时保留
indic_bt字段:
IPI <- get_eurostat("sts_inpr_m") %>% select("geo", "time", "indic_bt", "values") %>% mutate(time=format(as.Date(time, "%Y-%m-%d"))) %>% filter(geo %in% c("ES", "IT", "FR", "EU28", "EA19"))
- 根据需求选择转宽方式:
- 方式1:将指标类型和地区合并为列名,同时保留所有指标:
IPI_wide <- IPI %>% pivot_wider(names_from = c(indic_bt, geo), values_from = values)
- 方式2:先筛选特定指标(比如仅保留总指数,需替换为对应
indic_bt编码),再转宽:
# 示例:筛选总指数(编码需根据Eurostat实际定义调整) IPI_total <- IPI %>% filter(indic_bt == "PROD_IND_TOTAL") %>% pivot_wider(names_from = geo, values_from = values)
场景2:重复值为数据冗余/错误
如果这些重复值是导入或处理时产生的冗余数据,可先对time+geo组合做聚合处理,再转宽:
- 取平均值:
IPI_wide <- IPI %>% group_by(time, geo) %>% summarise(values = mean(values, na.rm = TRUE)) %>% ungroup() %>% pivot_wider(names_from = geo, values_from = values)
- 保留第一条记录:
IPI_wide <- IPI %>% group_by(time, geo) %>% slice(1) %>% ungroup() %>% pivot_wider(names_from = geo, values_from = values)
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

