我想知道将例如分位数列添加到数据集的最佳方法是什么。我正在考虑为此使用 ave() 函数,例如 ave(iris$Sepal.Length, iris$Species, FUN=quantile)
- 但在这种情况下,ave()
合并由返回的值quantile()
(在这种情况下,每个子集返回 5 个值)并将它们切割为iris
......
提前感谢您的建议!
我想知道将例如分位数列添加到数据集的最佳方法是什么。我正在考虑为此使用 ave() 函数,例如 ave(iris$Sepal.Length, iris$Species, FUN=quantile)
- 但在这种情况下,ave()
合并由返回的值quantile()
(在这种情况下,每个子集返回 5 个值)并将它们切割为iris
......
提前感谢您的建议!
关于这个一般主题有很多 SO 问题,推荐 , , , 的各种用途,或ave()
根据个人喜好、可读性、紧凑性、灵活性、速度......这是一个简单的解决方案,似乎可以满足您的需求:aggregate()
plyr()
reshape2::cast
data.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()
更多返回的奇怪数据帧(名称仍然有点不稳定)。
使用data.table包:
library(data.table)
dt <- data.table(iris)
dt[, paste0("q", 25*(0:4)) := as.list(quantile(Sepal.Length)), by="Species"]