聚合函数不遵守向量的字母顺序
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) factor 将 Binomial_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()
我有一个 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) factor 将 Binomial_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()