Упорядочивание гистограммы только по одному уровню факторной переменной

Мои данные выглядят так:

Col1  Col2  Col3
A     Dog   3
A     Cat   5
A     Hat   6
B     Dog   8
B     Cat   3
B     Hat   4

Col1 и Col2 - факторы, а A - первый уровень Col1.

Я хочу построить столбец Col2 как столбчатую диаграмму в порядке убывания по столбцу Col3, но где порядок столбца Col2 в пределах уровня фактора, определенного как A в столбце Col1, имеет приоритет. То есть я хочу, чтобы данные были отображены следующим образом (я перевернул оси так, чтобы значения в Col2 были на оси y, поэтому столбцы графика будут читаться сверху вниз):

Col1  Col2  Col3
A     Hat   6
B     Hat   4
A     Cat   5
B     Cat   3
A     Dog   3
B     Dog   8

Прямо сейчас я могу получить только ggplot для отображения столбцов, определяемых наибольшим общим значением (8), а не наибольшим значением только на уровне фактора A (6). Вот так это выглядит:

Col1  Col2  Col3
A     Dog   3
B     Dog   8
A     Hat   6
B     Hat   4
A     Cat   5
B     Cat   3

Я знаю, что могу сделать это вручную, повторно указав уровни фактора в Col2, но мои реальные данные имеют 40 значений для Col2, поэтому потребуется много печатать. Я заказал и сократил фрейм данных с помощью arrange(Col1, desc(Col3)) %>% select(Col2), чтобы получить вектор, содержащий правильный порядок столбцов Col2 (right_order = "Hat", "Hat", "Cat", "Cat", "Dog", "Dog"), но я не могу понять, как использовать этот вектор, чтобы сообщить ggplot, как упорядочить данные. Я пробовал использовать его в reorder, но получил ошибку arguments must have the same length. Я прочитал бесчисленное количество вопросов и руководств по переупорядочиванию уровней факторов для построения графика в ggplot, но я не могу найти указаний о том, как просто использовать порядок в пределах одного уровня фактора (A в Col1) для построения графика.


person Kellan Baker    schedule 27.04.2020    source источник


Ответы (2)


Мы могли arrange после преобразования в factor с индивидуальным заказом

library(dplyr)
df1 %>% 
    arrange(Col1, desc(Col3)) %>% 
    mutate(Col2 = factor(Col2, levels = unique(Col2))) %>% 
    arrange(Col2, Col1, desc(Col3))
#   Col1 Col2 Col3
#1    A  Hat    6
#2    B  Hat    4
#3    A  Cat    5
#4    B  Cat    3
#5    A  Dog    3
#6    B  Dog    8

данные

df1 <- structure(list(Col1 = c("A", "A", "A", "B", "B", "B"), Col2 = c("Dog", 
"Cat", "Hat", "Dog", "Cat", "Hat"), Col3 = c(3L, 5L, 6L, 8L, 
3L, 4L)), class = "data.frame", row.names = c(NA, -6L))
person akrun    schedule 27.04.2020
comment
Мои данные имеют 160 значений исходной факторной переменной, которые перекодированы в 40 уровней Col2 (повторяются для каждого уровня Col1) после вычисления попарных сумм Col3. Таким образом, из исходных данных не сразу видно, какое из значений в столбце 3 (и, следовательно, уровни столбца 2) окажется наибольшим. Даже когда я смогу проверить порядок 40 уровней Col2 в пределах одного уровня Col1, я бы не хотел вручную переупорядочивать уровни факторов в Col2 и использовать вектор в правильном порядке (сгенерированный из расположения (Col1, desc (Col3))% ›% select (Col2)) вместо этого. - person Kellan Baker; 27.04.2020
comment
@KellanBaker, это не заказ вручную. Сначала мы упорядочиваем по столбцу Col1 и убывающему порядку столбца Col3, чтобы изменить уровни столбца Col2, а затем снова выполняем arrange. - person akrun; 27.04.2020

У вас почти есть ответ (как и @akrun), но я думаю, что поэтапное решение здесь является ключевым моментом. В целом подход такой же. Сначала нанесите на график свои данные (df1):

ggplot(df1, aes(Col2, Col3)) + geom_col()

введите здесь описание изображения

Затем выполните указанную вами аранжировку, отметив, что на выходе получается объект data.frame, называемый d. Затем мы сопоставляем unique() значения этого столбца (d$Col2) для рефакторинга d1$Col2:

d <- df1 %>% arrange(Col1, desc(Col3)) %>% select(Col2)  # returns a dataframe!
df1$Col2 <- factor(df1$Col2, levels=unique(d$Col2))  # unique values of d$Col2 set to levels of df1$Col2 factor

Затем вы можете снова построить график и увидеть, как столбцы переупорядочены:

введите здесь описание изображения

Я думаю, что проблема с подходом @akrun заключалась в том, что он не работал с факторингом в командах канала. Делайте это поэтапно: (1) упорядочивайте, (2) получите из этого свой уникальный порядок, (3) проведите рефакторинг.

person chemdork123    schedule 27.04.2020