【问题标题】:Using ave() with function which returns a vector将 ave() 与返回向量的函数一起使用
【发布时间】:2013-01-27 19:49:58
【问题描述】:

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

提前感谢您的建议!

【问题讨论】:

    标签: r


    【解决方案1】:

    关于这个一般话题有很多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()返回的怪异数据帧解包更多(名称仍然有点古怪)。

    【讨论】:

    • 本,感谢您的快速答复!我知道聚合,但它返回一个没有原始值的“汇总”表,而我想保留原始表并只添加带有分位数的列(是的,其中会有一些冗余)。
    • 带有merge 的变体完美运行(尽管最初我试图在没有它的情况下进行管理:])。但我应该注意,重铸不能正常工作:如果你先看,比如 15 行,你会看到从第 11 行开始,分位数值取自另一个子集。所以,我将使用merge 变体。再次感谢!
    • P.S. @Ben,你能告诉我在哪里可以阅读更多关于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"). 它通常不会出现在用户生成的数据框中...
    【解决方案2】:

    使用 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")
    • 哎呀,我的错:错误是在 RStudio 中查看表格引起的。感谢您提供另一个解决方案!
    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多