Сортировка фрейма данных по нескольким переменным - PullRequest
1 голос
/ 25 апреля 2020

У меня есть фрейм данных с 4 группами (определяется категориями «a» и «b» в столбце 1 и категориями «X» и «Y» в столбце 2). Я хочу ранжировать атрибуты в столбце 3 по их значениям в столбце 4, но конкретно в группах в столбцах 1 и 2 (AX, AY, BX, BY).

Как я могу go из этого :

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 ]

2 голосов
/ 25 апреля 2020

@ Акрун прав, нет необходимости в 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
2 голосов
/ 25 апреля 2020

Для этого нам не нужно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...