聚合函数不遵守向量的字母顺序

Aggregate function does not respect alphabetical order of a vector

我有一个 data.frame(简化)如下所示:

Binomial<-c(rep("Capra aegagrus",2),rep("Capreolus capreolus",3),"Capra ibex")
area<-c(500,200,10,300,15,5)
mydata<-data.frame(Binomial,area)

我想获得一个新的 data.frame,其中包含物种名称 (mydata$Binomial) 以及每个物种所有面积的总和。这是我到目前为止的过程:

#sum all the areas of each species 
a<-aggregate(mydata$area,list(mydata$Binomial),FUN=sum)
#create a vector with a length equal to mydata number of rows
n<-max(lengths(mydata)) 
#insert the total of the areas of each species in the first row, and fill the rest with NA 
b<-lapply(a, `length<-`, n) 
summary(b)  
#Group.1 is the species, x is the area
#create a column with the species 
mydata$Binomial_2<-b$Group.1 
#create a column with the areas
mydata$area_tot<-b$x 
#create a final data frame with the species and the total of the areas 
mydata_2<-mydata[c(1:3),c(3:4)]

到目前为止,它适用于不同的数据集。问题是,如果我检查 a,我发现物种的顺序与 mydata 中的顺序不同:现在 Capra ibex 在 Capreolus capreolus 之前。这打乱了我接下来的分析。您对如何在此脚本中保留 mydata 的字母顺序有什么建议吗?这意味着它应该是 Capra aegagrus,然后是 Capreolus capreolus,最后是 mydata_2 中的 Capra ibex。谢谢。

关于问题的主题,正如评论者已经指出的那样,输出是按字母顺序排列的,因此我们假设这不是问题所在,问题在于我们希望保留输入顺序。

1) factorBinomial_2 列定义为具有所需顺序的因子。也就是说,在问题的第一个块中定义 mydata 之后,将其余代码替换为:

tmp <- transform(mydata, Binomial_2 = factor(Binomial, levels = unique(Binomial)))
aggregate(area ~ Binomial_2, tmp, FUN = sum)
##                Binomial_2 area
##     1      Capra aegagrus  700
##     2 Capreolus capreolus  325
##     3          Capra ibex    5

或使用管道:

mydata |>
  transform(Binomial_2 = factor(Binomial, levels = unique(Binomial))) |>
  stats:::aggregate.formula(formula = area ~ Binomial_2, FUN = sum)

2)ave另一种做法是:

tmp <- with(mydata, 
  data.frame(Binomial_2 = Binomial, area = ave(area, Binomial, FUN = sum)))
unique(tmp)
##            Binomial_2 area
## 1      Capra aegagrus  700
## 2 Capreolus capreolus  325
## 3          Capra ibex    5

对于管道,这可以表示为

mydata |>
  with(data.frame(Binomial_2 = Binomial, area = ave(area, Binomial, FUN = sum))) |>
  unique()