如何在R中使用dlply函数处理多个分组变量?
dlply多变量分组的等效写法(对应aggregate的by=list())
嘿,刚好熟悉plyr包的用法,我来给你讲清楚dlply怎么实现和aggregate多变量分组一样的效果~
首先先回顾下你提到的aggregate写法:
- 单变量分组(by参数形式):
aggregate(mtcars$mpg, by = list(mtcars$cyl), FUN = mean) - 多变量分组就是把list里的元素加多,比如按气缸数
cyl和档位gear分组:aggregate(mtcars$mpg, by = list(mtcars$cyl, mtcars$gear), FUN = mean)
对应到dlply的话,有两种常用的等效写法,核心是处理.variables这个参数:
写法1:用.()包裹多个变量名
这是plyr包最常用的分组写法,直接在.()里列出要分组的变量(不需要加data$前缀,因为已经指定了数据源):
library(plyr) # 按cyl和gear分组,对每个子集计算mpg的均值 dlply(mtcars, .(cyl, gear), function(subset_data) mean(subset_data$mpg))
这里dlply会把每个分组对应的完整数据框子集传给后面的函数,所以你可以在函数里灵活访问子集里的任何变量,比aggregate更灵活。
写法2:用字符向量指定变量名
如果你的分组变量是动态生成的字符串(比如从向量里读取变量名),可以用字符向量的形式:
group_vars <- c("cyl", "gear") dlply(mtcars, group_vars, function(subset_data) mean(subset_data$mpg))
这种写法和第一种效果完全一样,只是更适合自动化的场景。
最后补充下:dlply返回的是一个列表(每个元素对应一个分组的计算结果),如果想要和aggregate一样返回数据框格式,可以用ldply代替dlply,用法完全一致,只是输出类型不同。
内容的提问来源于stack exchange,提问作者kl-higgins
相关产品推荐
相关产品推荐

