使用dcast(melt...)出现'Aggregation function missing'错误的排查与解决
解决dcast报错"Aggregation function missing: defaulting to length"的问题
先还原你的场景:你有这样的初始数据:
df_mcmc <- data.frame( RNR = c(1,1,2,2), RoundNR = c(1,2,1,2), X = c(13,23,34,33), Y = c(19,23,17,20), Z = c(0.0,0.0,0.3,0.4) )
你想用reshape2的melt+dcast把它转成变量名后缀带RoundNR的宽格式(比如X_1、X_2),原来的代码是:
temp <- dcast(melt(df_mcmc, id.vars=c("RNR", "RoundNR")), RNR~variable+RoundNR)
之前能正常运行,但重启后报错"Aggregation function missing: defaulting to length",尝试指定reshape2::前缀也没用,最后发现是数据里意外出现重复行导致的问题。
错误原因到底是什么?
dcast的核心逻辑是根据你指定的行、列分组规则,把对应的值填充到新格式里。如果在同一个行分组(这里是RNR)+列分组(variable+RoundNR)的组合下,对应了多个重复值,它就会默认认为你需要对这些值做聚合操作(比如求和、取均值),这时候就会抛出这个提示,默认用length来计数。
你之前的代码能正常运行,是因为数据里每个(RNR, RoundNR, variable)的组合都是唯一的——每个RNR对应两个RoundNR,每个RoundNR下的变量值只有一个。但当你不小心复制了一行后,就出现了同一组合对应多个值的情况,dcast就不知道该怎么处理这些重复值,只能提示你需要聚合函数。
怎么解决?
方案1:先清理重复行
既然问题根源是重复行,那先找出并删除重复行就可以解决:
# 检查是否存在重复行 duplicated_rows <- which(duplicated(df_mcmc)) # 删除重复行得到干净的数据 df_mcmc_clean <- df_mcmc[!duplicated(df_mcmc), ] # 重新运行转换代码 temp <- reshape2::dcast(reshape2::melt(df_mcmc_clean, id.vars=c("RNR", "RoundNR")), RNR~variable+RoundNR)
方案2:添加唯一行标识符(预防重复问题)
如果担心以后再出现类似的重复问题,可以在melt时加入一个唯一行ID,让dcast明确知道每行都是独立的,不需要聚合:
# 给每行添加唯一ID df_mcmc$row_id <- seq(nrow(df_mcmc)) # melt时把row_id也作为标识变量 melted <- reshape2::melt(df_mcmc, id.vars=c("row_id", "RNR", "RoundNR")) # dcast时保留row_id,之后按需删除 temp <- reshape2::dcast(melted, row_id + RNR~variable+RoundNR) # 移除不需要的row_id列 temp <- temp[, !names(temp) %in% "row_id"]
验证结果
用清理后的无重复数据运行代码,就能得到你想要的目标格式:
> temp RNR X_1 X_2 Y_1 Y_2 Z_1 Z_2 1 1 13 23 19 23 0.0 0.0 2 2 34 33 17 20 0.3 0.4
内容的提问来源于stack exchange,提问作者R. Iersel
相关产品推荐
相关产品推荐

