在R中的aggregate()函数中,有没有一种方法可以对多个列的输出进行排序?
我想使用聚合函数,但是要根据两列(第一列,然后是另一列的子集)对输出进行排序(从最小到最大) 以下是一个例子:在R中的aggregate()函数中,有没有一种方法可以对多个列的输出进行排序?,r,aggregate,R,Aggregate,我想使用聚合函数,但是要根据两列(第一列,然后是另一列的子集)对输出进行排序(从最小到最大) 以下是一个例子: test<-data.frame(c(sample(1:4),1),sample(2001:2005),11:15,c(letters[1:4],'a'),sample(101:105)) names(test)<-c("plot","year","age","spec","biomass") test plot year age spec biomass 1 2
test<-data.frame(c(sample(1:4),1),sample(2001:2005),11:15,c(letters[1:4],'a'),sample(101:105))
names(test)<-c("plot","year","age","spec","biomass")
test
plot year age spec biomass
1 2 2001 11 a 102
2 4 2005 12 b 101
3 1 2004 13 c 105
4 3 2002 14 d 103
5 1 2003 15 a 104
aggregate(biomass~plot+year,data=test,FUN='sum')
但我希望输出是按情节排序,然后按年份排序
plot year biomass
1 1 2003 104
2 1 2004 105
3 2 2001 102
4 3 2002 103
5 4 2005 101
谢谢 aggregate函数按列进行排序。切换参数的顺序以获得所需的排序:
# switch from
a0 <- aggregate(biomass~plot+year,data=test,FUN='sum')
# to
a <- aggregate(biomass~year+plot,data=test,FUN='sum')
#从
a0在生成随机数据之前,请使用set.seed
(就像您对sample
所做的那样)。我相信您知道,在aggregate
中切换两个变量的顺序会按照您的意愿排序。如果您希望列按特定顺序排列,那么很容易在末尾对它们进行重新排序:aggregate(biometry~year+plot,data=test,FUN='sum')[,c(2,1,3)]
。然而,我需要在一个数据集上使用这个方法,这个数据集有50多个图,每个图都有80年的历史,所以这个方法对于那个用途来说并不实用。谢谢。为什么以后你不能对数据进行排序呢?我可以。但我也把它放到一个循环中,对100种不同的物种进行分析,我不希望这个循环比实际情况更复杂。如果有一种方法可以简单地将多个列的排序合并到聚合中,那么我就可以真正减少代码的长度。谢谢。@森林生态学家如果有一些复杂的因素使得这不可行,那么应该在原始问题中更清楚地说明这个因素。“为100人做这件事”太模糊了。也许可以使用setorder(setDT(a0),plot,year)
?@davidernburg当然可以,但为什么我们只是将参数的顺序更改为aggregate
就可以进行事后排序呢?OP对data.tables不感兴趣,但这种方法也可以用data.frames来实现,比如a0[with(a0,order(plot,year)),]
之类的。我认为,你的方法是不同的,应该有一个单独的答案。
# switch from
a0 <- aggregate(biomass~plot+year,data=test,FUN='sum')
# to
a <- aggregate(biomass~year+plot,data=test,FUN='sum')