R-为aggregate()的输出data.frame指定所需的行顺序

R-为aggregate()的输出data.frame指定所需的行顺序,r,sorting,aggregate,R,Sorting,Aggregate,Iaggregate() 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:

I
aggregate()

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
如何使用base R实现这一点?需要明确的是,这本质上是一个数据帧行排序问题,其中上下文是
aggregate()
函数(可能重要,也可能不重要)

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


更新

为了将来的参考,我找到了一个解决方案,可以根据这个图上的目标向量对data.frame的行进行排序。我想它可以作为后处理步骤

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

这可能是一种可能性:将“站点”转换为
因子
,并指定
级别
中的顺序

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
或者,在公式界面内转换为因子,并重命名转换后的站点列:

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

df2谢谢Henrik,是否有其他方法来指定聚合()之后或期间的顺序?我看到您已经用“after alternative”更新了您的问题。我想给你指出一些类似的东西。现在我还不知道一个干净的“中间”替代方法。@Zhubarb,还有一种非公式的方法来聚合
aggregate
<代码>带有(df、聚合(列表(值=值)、列表(站点=因子(站点,重新排序))、乐趣=总和))
。Henrik,您也可以在公式版本中使用
因子
,但结果列名称很时髦,因此需要重命名。@AnandaMahto,非常感谢您提出的非公式方法。我把它添加到答案中。干杯。@AnandaMahto,是的,在我发布第一个答案之前,我试着在公式版中使用
因子
,但由于名字的滑稽性而跳过了它。我以前没有尝试过将
x
指定为
列表
——能够立即设置结果列的名称确实很有用。干杯
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