按多个变量对数据框进行排序

时间:2020-04-25 18:54:37

标签: r dplyr grouping

我有一个包含4组的数据框(由第1列中的类别“ a”和“ b”以及第2列中的类别“ X”和“ Y”定义)。我想按属性在第4列中的值对第3列中的属性进行排名,但特别要在第1列和第2列的组(AX,AY,BX,BY)中进行排序。

我该怎么办:

col1    col2    col3    col4
a       X       pat     1
b       Y       dog     2
b       X       leg     3
a       X       hog     4                   
b       Y       egg     5
a       Y       log     6
b       X       map     7
b       Y       ice     8
b       X       mat     9
a       Y       sat     10

对此吗?

col1    col2    col3    col4
a       X       hog     4
a       X       pat     1
a       Y       sat     10
a       Y       log     6                   
b       X       mat     9
b       X       map     7
b       X       leg     3
b       Y       ice     8
b       Y       egg     5
b       Y       dog     2

(下面的示例输入代码)

col1 <- c('a','b','b','a','b','a','b','b','b','a')
col2 <- c('X','Y','X','X','Y','Y','X','Y','X','Y')
col3 <- c('pat','dog','leg','hog','egg','log','map','ice','mat','sat')
col4 <- c(1,2,3,4,5,6,7,8,9,10)

df <- data.frame(col1,col2,col3,col4)

colA <- c('a','a','a','a','b','b','b','b','b','b')
colB <- c('X','X','Y','Y','X','X','X','Y','Y','Y')
colC <- c('hog','pat','sat','log','mat','map','leg','ice','egg','dog')
colD <- c(4,1,10,6,9,7,3,8,5,2)

df1 <- data.frame(colA,colB,colC,colD)

我尝试了以下方法,但是它给出的随机排列没有我想要的组内排名结构:

df %>% group_by(col1, col2) %>% arrange(desc(col4)) 

df %>% group_by(col1) %>% arrange(col1) %>% group_by(col2) %>% arrange(col2)按前两列正确地对数据帧进行排序,但是我无法再按col4对其进行排序。

2 个答案:

答案 0 :(得分:2)

为此,我们不需要group_by

library(dplyr)
df %>%
    arrange(col1, col2, desc(col4))
#   col1 col2 col3 col4
#1     a    X  hog    4
#2     a    X  pat    1
#3     a    Y  sat   10
#4     a    Y  log    6
#5     b    X  mat    9
#6     b    X  map    7
#7     b    X  leg    3
#8     b    Y  ice    8
#9     b    Y  egg    5
#10    b    Y  dog    2

答案 1 :(得分:2)

@akrun是正确的,不需要group_bydata.table中的等效实现为:

library(data.table)
setDT(df)
df[order(col1, col2, -col4)]
    col1 col2 col3 col4
 1:    a    X  hog    4
 2:    a    X  pat    1
 3:    a    Y  sat   10
 4:    a    Y  log    6
 5:    b    X  mat    9
 6:    b    X  map    7
 7:    b    X  leg    3
 8:    b    Y  ice    8
 9:    b    Y  egg    5
10:    b    Y  dog    2