使用dplyr在R中排序:如何根据一列中的类别和另一列中的类别进行排序?

使用dplyr在R中排序:如何根据一列中的类别和另一列中的类别进行排序?,r,dataframe,dplyr,plyr,R,Dataframe,Dplyr,Plyr,下面是一个示例数据框。我需要按类型、种类和BdFt对其进行排序。下面的例子几乎是正确的,但是我不希望物种按字母顺序排序。我想根据每个物种的总和(在每个“类型”中)按降序对物种进行排序。例如,在类型4404中,“DF”应该首先出现。我还想保持目前的观测数量,所以我不想按物种组进行合并。有谁能帮我实现这一点,也许是用dplyr -布兰登 Type Species BdFt 4404 BB 164 4404 BB 55 4404 BM

下面是一个示例数据框。我需要按类型、种类和BdFt对其进行排序。下面的例子几乎是正确的,但是我不希望物种按字母顺序排序。我想根据每个物种的总和(在每个“类型”中)按降序对物种进行排序。例如,在类型4404中,“DF”应该首先出现。我还想保持目前的观测数量,所以我不想按物种组进行合并。有谁能帮我实现这一点,也许是用dplyr

-布兰登

   Type Species  BdFt
   4404      BB   164
   4404      BB    55
   4404      BM   831
   4404      BM   419
   4404      BM   242
   4404      BM    20
   4404      CH   565
   4404      CH   206
   4404      CH    88
   4404      CO  1817
   4404      CO   531
   4404      CO   286
   4404      CO    31
   4404      DF 19740
   4404      DF  5930
   4404      DF   613
   4404      DF   468
   4404      DF   167
   4404      GF   360
   4404      GF   232
   4404      GF   124
   4410      BM   909
   4410      CH   161
   4410      DF 18756
   4410      GF  3642
   4410      RA   549

这里有一个带有
arrange

library(dplyr)
df2 <- df1 %>% 
       arrange(Type, desc(ave(BdFt, Species, Type,  FUN = sum))) 

df2
#   Type Species  BdFt
#1  4404      DF 19740
#2  4404      DF  5930
#3  4404      DF   613
#4  4404      DF   468
#5  4404      DF   167
#6  4404      CO  1817
#7  4404      CO   531
#8  4404      CO   286
#9  4404      CO    31
#10 4404      BM   831
#11 4404      BM   419
#12 4404      BM   242
#13 4404      BM    20
#14 4404      CH   565
#15 4404      CH   206
#16 4404      CH    88
#17 4404      GF   360
#18 4404      GF   232
#19 4404      GF   124
#20 4404      BB   164
#21 4404      BB    55
#22 4410      DF 18756
#23 4410      GF  3642
#24 4410      BM   909
#25 4410      RA   549
#26 4410      CH   161
数据
df1是另一种选择,尽管不如阿克伦的回答那么简洁

库(dplyr)
图书馆(tidyr)
dat%>%
按(类型、种类)划分的组别%>%
汇总(SumBdFt=总和(BdFt))%>%
解组()%>%
全联接(dat,by=c(“类型”、“种类”))%>%
排列(类型,描述(SumBdFt),BdFt)%>%
选择(-SumBdFt)
##A tibble:26 x 3
#模式种
#        
#14404DF167
#24404 DF 468
#34404DF613
#4404 DF 5930
#54404 DF19740
#64404公司31
#74404公司286
#84404 CO 531
#94404 CO 1817
#104404BM 20
# # ... 还有16行

资料


dat%summary(…)

⊕1用于显示tidyverse和传统R方法。
df1[with(df1, order(Type, -ave(BdFt, Species, Type,  FUN = sum))),]
df1 <- structure(list(Type = c(4404L, 4404L, 4404L, 4404L, 4404L, 4404L, 
4404L, 4404L, 4404L, 4404L, 4404L, 4404L, 4404L, 4404L, 4404L, 
4404L, 4404L, 4404L, 4404L, 4404L, 4404L, 4410L, 4410L, 4410L, 
4410L, 4410L), Species = c("BB", "BB", "BM", "BM", "BM", "BM", 
"CH", "CH", "CH", "CO", "CO", "CO", "CO", "DF", "DF", "DF", "DF", 
"DF", "GF", "GF", "GF", "BM", "CH", "DF", "GF", "RA"), BdFt = c(164L, 
55L, 831L, 419L, 242L, 20L, 565L, 206L, 88L, 1817L, 531L, 286L, 
31L, 19740L, 5930L, 613L, 468L, 167L, 360L, 232L, 124L, 909L, 
161L, 18756L, 3642L, 549L)), class = "data.frame", row.names = c(NA, 
-26L))