如何将R语言长格式DataFrame转宽格式,适配相关矩阵等数据分析?
R语言实现长格式转宽格式(多分组行标识)
针对你的需求,这里提供两种常用的实现方式,都是R生态中处理长转宽场景的标准方案:
方法一:用tidyr::pivot_wider(推荐,tidyverse生态)
这是当前最灵活易用的长转宽工具,属于tidyverse套件的一部分,语法清晰且扩展性强。
# 先加载tidyverse(包含tidyr包) library(tidyverse) # 执行转换:以Area+Year为行标识,Item为列名,Value为填充值,缺失值用NA填充 wide_df <- df %>% pivot_wider( id_cols = c(Area, Year), names_from = Item, values_from = Value, values_fill = list(Value = NA) )
额外处理:Item与Unit的对应关系
如果每个Item的单位(Unit)是固定的,可以单独提取一份单位映射表,方便后续可视化时参考:
unit_reference <- df %>% distinct(Item, Unit) %>% arrange(Item)
方法二:用base R的reshape函数
如果不想加载额外包,可以用R基础包自带的reshape函数:
# 基础包转换 wide_df_base <- reshape( data = df, idvar = c("Area", "Year"), # 行标识字段 timevar = "Item", # 转成列的字段 direction = "wide", # 指定转换方向为宽格式 v.names = "Value", # 填充列的数值字段 drop = "Unit" # 移除不需要的Unit字段,按需调整 ) # 自动生成的列名会带"Value."前缀,可移除: colnames(wide_df_base) <- gsub("Value\\.", "", colnames(wide_df_base))
注意事项
- 确保
Area和Year的组合是唯一的行标识,否则同一分组下多值会导致列表列(可通过values_fn参数聚合,比如values_fn = list(Value = mean)取均值) - 转换完成后,直接用
wide_df即可做相关矩阵、热图等分析:# 计算相关矩阵(忽略NA) cor_matrix <- cor(wide_df[, -c(1, 2)], use = "pairwise.complete.obs") # 绘制热图(基础包示例) heatmap(cor_matrix)
内容的提问来源于stack exchange,提问作者Santiago Fernndez del Castillo
相关产品推荐
相关产品推荐

