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

我如何使用基础 R 来做到这一点? 需要明确的是,这本质上是一个数据框行排序问题,其中上下文是 aggregate() 函数(可能重要也可能无关紧要)。

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

更新

为了将来引用,我找到了一个解决方案,用于根据此 link 上的目标向量对 data.frame 的行进行排序。我想它可以用作后处理步骤。
df.site.sums[match(reorder,df.site.sums$site),]

最佳答案

这可能是一种可能性:将 'site' 转换为 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

关于R - 为aggregate() 的输出data.frame 指定所需的行顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20609564/

10-12 19:11