使用带有返回向量的函数的ave()

时间:2013-01-27 19:49:58

标签: r

我想知道在数据集中添加分位数列的最佳方法是什么。我正在考虑使用ave()函数,类似ave(iris$Sepal.Length, iris$Species, FUN=quantile) - 但在这种情况下ave()合并quantile()返回的值(在这种情况下,每个子集返回5个值)和将它们剪成iris ...

的长度

提前感谢您的建议!

2 个答案:

答案 0 :(得分:4)

关于这个一般主题有很多SO问题,建议ave()aggregate()plyr()reshape2::castdata.table取决于各种用途个人偏好,可读性,紧凑性,灵活性,速度......这是一个简单的aggregate()解决方案,似乎可以做你想做的事情:

(aa <- aggregate(Sepal.Length~Species,data=iris,quantile))

##      Species Sepal.Length.0% Sepal.Length.25% Sepal.Length.50% Sepal.Length.75%
## 1     setosa           4.300            4.800            5.000            5.200
## 2 versicolor           4.900            5.600            5.900            6.300
## 3  virginica           4.900            6.225            6.500            6.900
##   Sepal.Length.100%
## 1             5.800
## 2             7.000
## 3             7.900

编辑:重新阅读/基于评论,这不是您想要的:您需要为每行复制的汇总值,而不是每组一次。

也许

merge(iris,aa,by="Species")

虽然这给出了一个稍微奇怪的数据框(最后一个“列”实际上是一个矩阵)。

这有点神奇,但是

merge(iris,with(aa,data.frame(Species,Sepal.Length)))

更好 - 它将aggregate()返回的奇怪数据帧解压缩一点(名称仍然有点不稳定)。

答案 1 :(得分:3)

使用 data.table 包:

library(data.table)
dt <- data.table(iris)
dt[, paste0("q", 25*(0:4)) := as.list(quantile(Sepal.Length)), by="Species"]