R 将ave()与返回向量的函数一起使用

R 将ave()与返回向量的函数一起使用,r,R,我想知道向数据集添加分位数列的最佳方法是什么。我在考虑使用ave()函数,类似于ave(iris$Sepal.Length,iris$Species,FUN=quantile)-但在本例中ave()合并quantile()返回的值(在本例中,每个子集返回5个值),并根据iris的长度进行剪切 提前感谢您的建议 在这个一般性主题上有很多问题,根据个人喜好、可读性、紧凑性、灵活性、速度,推荐使用ave()、aggregate()、plyr()、restrape2::cast或data.table。。

我想知道向数据集添加分位数列的最佳方法是什么。我在考虑使用ave()函数,类似于
ave(iris$Sepal.Length,iris$Species,FUN=quantile)
-但在本例中
ave()
合并
quantile()
返回的值(在本例中,每个子集返回5个值),并根据
iris
的长度进行剪切


提前感谢您的建议

在这个一般性主题上有很多问题,根据个人喜好、可读性、紧凑性、灵活性、速度,推荐使用
ave()
aggregate()
plyr()
restrape2::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,with(aa,data.frame(Species,Sepal.Length)))

更好的方法是,它将
aggregate()
返回的奇怪数据帧解压得更多一些(名称仍然有点不确定)。

使用数据。表包:

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

本医生,谢谢你的快速回答!我知道聚合,但它返回一个没有原始值的“摘要”表,而我希望保留原始表,只添加带有分位数的列(是的,其中会有一些冗余)。带有
merge
的variant可以完美地工作(尽管最初我试图在没有它的情况下进行管理:)。但我应该注意到重铸并不能正确工作:如果你先看,比如说15行,你会看到从第11行开始,分位数的值是从另一个子集获取的。因此,我将使用
merge
variant。再次感谢!P.S.@Ben,你能给我一个提示,我可以在哪里阅读更多关于
aggregate()
返回的这个“奇怪”表单的信息吗?这不是我第一次见到它,所以我想了解这个列中矩阵是如何发生的,以及通常如何处理它。我不想创建单独的问题,因为这似乎是一个非常基本的问题-我只是不知道找到这个主题的正确关键字…如果你能想出一个方法来表达它,这将是一个非常好的问题。我不知道它被记录在哪里,除了在
?data.frame
:如果一个列表、数据帧或矩阵被传递到“data.frame”,就好像每个组件或列都作为一个单独的参数被传递一样(除了“model.matrix”类的矩阵和受“I”保护的矩阵).
它通常不会出现在用户生成的数据帧中…似乎有输入错误(缺少括号?)-最后一行在“[.data.frame”(dt,`:=`(paste0(“q”,25*(0:4))、as.list(分位数(Sepal.Length))、未使用的参数(by=“Species”)中给了我一个错误
oups,我的错误:错误是在RStudio中查看表格引起的。感谢您提供另一种解决方案!
library(data.table)
dt <- data.table(iris)
dt[, paste0("q", 25*(0:4)) := as.list(quantile(Sepal.Length)), by="Species"]