R语言:如何高效实现DataFrame按分组转置生成宽格式数据?
高效将长格式DataFrame转为宽格式的R实现方法
你当前用split逐行生成宽格式的方式效率太低,以下是几种更高效简便的实现方案,完全匹配你的目标格式:
方法1:tidyr包的pivot_wider(代码简洁,tidyverse生态)
pivot_wider是tidyverse专门用于长转宽的函数,直接通过参数设置就能完成缺失值填充:
library(tidyr) wide_df <- pivot_wider(df, id_cols = group, # 作为行标识的列 names_from = year, # 要转为列名的变量 values_from = amount,# 对应列值的变量 values_fill = 0) # 缺失年份填充0 # 输出结果 wide_df
方法2:data.table包的dcast(大数据场景下效率最优)
如果你的数据量较大,data.table的dcast在速度上会有明显优势:
library(data.table) # 转换为data.table对象 dt <- as.data.table(df) # 长转宽,fill参数设置缺失值为0 wide_dt <- dcast(dt, group ~ year, value.var = "amount", fill = 0) # 如需转回data.frame格式 wide_df <- as.data.frame(wide_dt)
方法3:Base R原生reshape函数(无需额外安装包)
不想加载第三方包的话,用base R的reshape也能实现,只需后续补全缺失值和调整列名:
wide_df <- reshape(df, idvar = "group", timevar = "year", direction = "wide", v.names = "amount") # 将NA替换为0,去掉列名中的"amount."前缀 wide_df[is.na(wide_df)] <- 0 colnames(wide_df) <- gsub("amount\\.", "", colnames(wide_df))
内容的提问来源于stack exchange,提问作者Ba Lalo
相关产品推荐
相关产品推荐

