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

预先感谢您的建议!

最佳答案

关于此一般主题,有很多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()返回的怪异数据帧解压缩的更多(名称仍然有些怪异)。

10-08 17:42