我有一个包含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对其进行排序。
答案 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_by
。 data.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