如何使用spread函数将R中eurostat长格式数据集转为宽格式?
解决长格式转宽格式的问题
问题原因
- 重复分组键:你的数据中同一个
time和geo组合对应多个values(比如DE在time=2018-01-01下有5条记录),spread无法直接将多个值塞进单个单元格,会生成不符合预期的列表列或报错。 - 列名不匹配:你在
select中使用的"UE"、"ZE"在原数据的geo列中不存在,对应的实际值是"EU27_2020"和"EA20",这会导致select找不到列而失败。
解决方案
先对重复的time-geo组合进行聚合(比如取均值、最大值等,根据你的需求选择),再转换为宽格式并重命名列:
步骤1:加载必要包
library(tidyverse)
步骤2:聚合重复数据
这里以计算均值为例,你可以替换为sum()、first()、last()等聚合函数:
taxaatur_EU_m_agg <- taxaatur_EU_m %>% group_by(time, geo) %>% summarise(values = mean(values), .groups = "drop")
步骤3:转换为宽格式并重命名列
推荐使用pivot_wider(tidyr包的最新函数,替代已退役的spread):
taxaatur_EU_m_wide <- taxaatur_EU_m_agg %>% pivot_wider(names_from = geo, values_from = values) %>% # 重命名列匹配你的需求 rename(UE = EU27_2020, ZE = EA20) %>% # 按指定顺序选择列 select(time, UE, ZE, DE, ES, FR, IT)
如果坚持使用spread,代码如下:
taxaatur_EU_m_wide <- taxaatur_EU_m_agg %>% spread(geo, values) %>% rename(UE = EU27_2020, ZE = EA20) %>% select(time, UE, ZE, DE, ES, FR, IT)
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

