我 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/