如何在R中用dcast将长格式数据转宽格式?遇格式异常求助
长转宽格式问题解决方法
R代码修正(reshape2/tidyr)
你的代码存在变量名不匹配的低级错误:先修改了olddata_wide$ID,但后续dcast调用的是df1,直接导致逻辑断裂。另外输出仅显示日期,大概率是同一ID+paydate存在重复记录,dcast默认用聚合函数(比如计数)覆盖了Type值。
修正后的reshape2代码
library(reshape2) # 统一使用数据集df1,先转换ID为因子 df1$ID <- factor(df1$ID) # 无重复记录时直接转换 widedf <- dcast(df1, ID ~ paydate, value.var = "Type", fun.aggregate = NULL) # 有重复记录时,指定聚合规则(比如取第一个匹配的Type) # widedf <- dcast(df1, ID ~ paydate, value.var = "Type", fun.aggregate = function(x) x[1])
推荐:用tidyr的pivot_wider(更易读)
reshape2已停止维护,tidyr的语法更直观,便于排查问题:
library(tidyr) widedf <- pivot_wider( data = df1, id_cols = ID, # 作为行标识的列 names_from = paydate, # 作为列名的字段 values_from = Type, # 填充单元格的字段 values_fn = first # 处理重复值的规则,保留第一个值 )
Excel无Power Query替代方案
如果不想用R,用Excel的数组公式也能实现:
- 先提取F列的唯一ID列表,G1:N1提取唯一的paydate列表
- 在G2输入公式:
=INDEX($C:$C,MATCH($F2&G$1,$A:$A&$B:$B,0)),按Ctrl+Shift+Enter(Excel 365及以后版本直接回车即可),然后下拉、右拉填充
内容的提问来源于stack exchange,提问作者willr
相关产品推荐
相关产品推荐

