【发布时间】:2013-01-27 19:49:58
【问题描述】:
我想知道将例如分位数列添加到数据集的最佳方法是什么。我正在考虑为此使用 ave() 函数,例如ave(iris$Sepal.Length, iris$Species, FUN=quantile) - 但在这种情况下,ave() 合并由quantile() 返回的值(在这种情况下,每个子集返回 5 个值)并将它们剪切为iris...
提前感谢您的建议!
【问题讨论】:
标签: r
我想知道将例如分位数列添加到数据集的最佳方法是什么。我正在考虑为此使用 ave() 函数,例如ave(iris$Sepal.Length, iris$Species, FUN=quantile) - 但在这种情况下,ave() 合并由quantile() 返回的值(在这种情况下,每个子集返回 5 个值)并将它们剪切为iris...
提前感谢您的建议!
【问题讨论】:
标签: r
关于这个一般话题有很多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()返回的怪异数据帧解包更多(名称仍然有点古怪)。
【讨论】:
merge 的变体完美运行(尽管最初我试图在没有它的情况下进行管理:])。但我应该注意,重铸不能正常工作:如果你先看,比如 15 行,你会看到从第 11 行开始,分位数值取自另一个子集。所以,我将使用merge 变体。再次感谢!
aggregate() 返回的“奇怪”表单的信息吗?这不是我第一次遇到它,所以我想了解这个列矩阵是如何发生的以及如何处理它。我不想创建单独的问题,因为它似乎是非常基本的问题 - 我只是不知道找到这个主题的正确关键字......
?data.frame 中倾斜:If a list or data frame or matrix is passed to ‘data.frame’ it is as if each component or column had been passed as a separate argument (except for matrices of class "model.matrix" and those protected by "I"). 它通常不会出现在用户生成的数据框中...
使用 data.table 包:
library(data.table)
dt <- data.table(iris)
dt[, paste0("q", 25*(0:4)) := as.list(quantile(Sepal.Length)), by="Species"]
【讨论】:
Error in `[.data.frame`(dt, , `:=`(paste0("q", 25 * (0:4)), as.list(quantile(Sepal.Length))), : unused argument(s) (by = "Species")