【问题标题】:R - Specifying a desired row order for the output data.frame of aggregate()R - 为 aggregate() 的输出 data.frame 指定所需的行顺序
【发布时间】:2013-12-16 11:15:26
【问题描述】:

I aggregate() value 列总和每 site 级别的 R data.frame 下面给出:

set.seed(2013)
df <- data.frame(site = sample(c("A","B","C"), 10, replace = TRUE),
                 currency = sample(c("USD", "EUR", "GBP", "CNY", "CHF"),10, replace=TRUE, prob=c(10,6,5,6,0.5)),
                 value = sample(seq(1:10)/10,10,replace=FALSE))

df.site.sums <- aggregate(value ~ site, data=df, FUN=sum)
df.site.sums

#  site value
#1    A   0.2
#2    B   0.6
#3    C   4.7

但是,我希望能够指定生成的df.site.sums 的行顺序。比如:

reorder <- c("C","B","A")
?special_sort(df, BY=site, ORDER=reorder) # imaginary function
#  site value
#1    C   4.7
#2    B   0.6
#3    A   0.2

我如何使用 base R 来做到这一点?为了清楚起见,这本质上是一个 数据框行排序问题,其中上下文是 aggregate() 函数(这可能重要也可能不重要)。

This 是相关的,但不能直接解决我的问题,或者我错过了解决方案的关键。


更新

为了将来参考,我在link 上找到了针对目标向量对 data.frame 的行进行排序的解决方案。我想它可以用作后处理步骤。

df.site.sums[match(reorder,df.site.sums$site),]

【问题讨论】:

    标签: r sorting aggregate


    【解决方案1】:

    这可能是一种可能性:将“站点”转换为factor 并在levels 中指定顺序。

    df$site2 <- factor(df$site, levels = c("C", "B", "A"))
    aggregate(value ~ site2, data = df, FUN = sum)
    
    #   site2 value
    # 1     C   4.7
    # 2     B   0.6
    # 3     A   0.2
    

    更新@Ananda Mahto 的评论(谢谢!)。您可以使用aggregate 的“非公式”方法:

    reorder <- c("C", "B", "A")
    with(df, aggregate(x = list(value = value),
                       by = list(site = factor(site, levels = reorder)),
                       FUN = sum))
    #   site value
    # 1    C   4.7
    # 2    B   0.6
    # 3    A   0.2
    

    或者,在公式界面中转换为因子,并重命名转换后的站点列:

    df2 <- aggregate(value ~ factor(site, levels = c("C", "B", "A")),
                     data = df, FUN = sum)
    df2
    names(df2) <- c("site", "value")
    df2
    

    【讨论】:

    • 谢谢 Henrik,有没有其他方法可以在 aggregate() 之后或期间指定顺序?
    • 我看到您已经用“替代方案”更新了您的问题。我打算给你指出类似的东西。现在我不知道一个干净的“期间”替代方案。
    • @Zhubarb,aggregate 也有 non-formula 方法。 with(df, aggregate(list(value = value), list(site = factor(site, reorder)), FUN=sum))。 Henrik,您也可以在公式版本中使用factor,但生成的列名很时髦,因此需要重命名。
    • @AnandaMahto,非常感谢您提出非公式方法。我将其添加到答案中。干杯。
    • @AnandaMahto,是的,我在发布我的第一个答案之前尝试在公式版本中使用factor,但由于名称的时髦而跳过了它。我之前没有尝试将x 指定为list - 能够立即设置结果列的名称确实很有用。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多