使用pivot_wider处理双值列:多分组数据宽表转换问题
解决tidyr::pivot_wider多列按年份组扩展的问题
问题核心
现有filtered_input数据集,包含year_group(4个取值)、exporter、FVA_origin、FYavgShares列,已按FYavgShares降序排序。需将FVA_origin和FYavgShares按year_group扩展为FVA_origin_1999-2002、FYavgShares_1999-2002形式的宽格式列,此前尝试pivot_wider时遇到单值行、仅转换单列、重复行生成列表值的问题。
解决方案
1. 先处理重复行(解决列表值问题)
因为exporter+year_group存在重复条目,pivot_wider会将同组多值存为列表。由于数据已按FYavgShares降序排序,优先保留每组排序后的首行:
library(dplyr) library(tidyr) # 去重:每个exporter+year_group仅保留FYavgShares最高的一行 clean_data <- filtered_input %>% distinct(exporter, year_group, .keep_all = TRUE)
如果需要聚合同组多值(而非去重),可按需用聚合函数处理:
# 示例:合并FVA_origin字符串,取FYavgShares均值 agg_data <- filtered_input %>% group_by(exporter, year_group) %>% summarize( FVA_origin = paste(FVA_origin, collapse = ", "), FYavgShares = mean(FYavgShares), .groups = "drop" )
2. 正确调用pivot_wider生成宽格式
指定id_cols为exporter作为行标识,同时转换两列并自定义列名格式:
# 基于去重后的数据集生成宽格式 wide_data <- clean_data %>% pivot_wider( id_cols = exporter, # 按exporter合并行 names_from = year_group, # 用year_group作为列名后缀来源 values_from = c(FVA_origin, FYavgShares), # 同时转换两列 names_glue = "{.value}_{year_group}" # 列名格式:原列名_年份组 )
问题原因解析
- 生成单值行:未明确指定
id_cols = exporter,导致pivot_wider将所有列视为行标识,无法合并同exporter的不同year_group数据。 - 仅转换单列:
values_from仅传入了FYavgShares,未包含FVA_origin,需将两列放入向量中同时转换。 - 生成列表值:
exporter+year_group存在重复行,同组多值被默认存储为列表,需先去重或聚合处理重复条目。
内容的提问来源于stack exchange,提问作者Melike
相关产品推荐
相关产品推荐

