plyr包ddply函数列命名规则疑问及示例求助
解决plyr包ddply函数的列命名问题
我完全懂你现在的困惑——想用ddply给聚合后的结果自定义列名(把默认的V1改成NB),结果反而得到了重复行的异常输出。别担心,这是因为你没摸准ddply的参数语法逻辑,我来一步步帮你搞定。
首先,先拆解你的异常示例为什么会出错:
当你写ddply(data, .(nom), NB=nrow)时,plyr并没有把NB=nrow当成“给聚合结果的列命名为NB”,而是错误地将这个赋值操作应用到了分组后的每一行上,相当于试图给原始数据的每一行都加个NB列,但nrow在这里没有被正确调用(缺少括号和参数),最终导致输出保留了所有原始行,还没正确计算分组行数。
接下来是正确的写法,推荐两种常用方式:
方式1:用summarise(或summarize)指定列名
这是最直观的方法,summarise是plyr专门用来聚合分组结果的函数,直接在里面定义你想要的列名和计算逻辑就行:
library(plyr) data <- data.frame(nom=c("a","b","c","a","b","a")) # 使用summarise自定义列名NB ddply(data, .(nom), summarise, NB = n())
输出结果完全符合你的预期:
nom NB 1 a 3 2 b 2 3 c 1
这里的n()是plyr提供的便捷函数,专门用来计算分组内的行数,比nrow(.)更简洁。
方式2:自定义函数返回命名数据框
如果你更习惯用函数的方式处理,也可以写一个小函数,返回带有指定列名的数据框:
ddply(data, .(nom), function(group) { data.frame(NB = nrow(group)) })
这个逻辑是:对每个分组group,计算它的行数,然后把结果放到名为NB的数据框里返回,ddply会自动把分组键(nom)和这个结果合并起来,输出正确的聚合表。
总结一下,ddply的第三个参数如果是聚合逻辑,要么用summarise指定列名,要么用函数返回命名数据框,不能直接写列名=函数名这种形式,这就是你之前出错的核心原因啦。
内容的提问来源于stack exchange,提问作者AnthoR
相关产品推荐
相关产品推荐

