ggpubr: сортировка по группам, но с другим порядком сортировки (asc, desc)

#r #sorting #grouping #ggpubr

Вопрос:

Я хочу отсортировать данные по группам, а затем для каждой группы отсортировать по разным порядкам (по возрастанию, нет, по убыванию), но, похоже, ggpubr sort.val аргумент принимает значение только длины 1. Мне интересно, какой альтернативный способ я могу сделать, чтобы результат достиг желаемого результата без значительных изменений?

Я буду использовать эти mtcars данные в качестве наглядного примера. Данные отсортированы по cyl группам (3 группы) и отображаются по asc порядку, можно ли назначить трем группам разные порядки сортировки? Скажем, например, «asc», «нет», «desc»? (Я пытался c("asc", "none", "desc") , но это не сработало).

Ниже приведен мой минимальный рабочий пример.

 # Require the package
library(ggpubr)


data("mtcars")
dfm <- mtcars
# Convert the cyl variable to a factor
dfm$cyl <- as.factor(dfm$cyl)
# Add the name colums
dfm$name <- rownames(dfm)
# Inspect the data
head(dfm[, c("name", "wt", "mpg", "cyl")])

# Sort by group and by ascending order

ggbarplot(dfm, x = "name", y = "mpg",
          fill = "cyl",       # change fill color by cyl
         color = "white", # Set bar border colors to white
          palette = "jco",  # jco journal color palett. 
          sort.val = "asc",  # Sort the value in dscending order 
          sort.by.groups = TRUE, # Sort inside each group
          x.text.angle = 90 # Rotate vertically x axis texts
          ) 

Ответ №1:

Вот еще один способ обработки первых данных:

  1. имена строк в первый столбец с rownames_to_column
  2. cyl чтобы учесть
  3. после группировки sort внутри групп с ifelse помощью оператора и
  4. и важно arrange , чтобы cyl
 library(tidyverse)
library(ggpubr)

dfm <- mtcars %>% 
    rownames_to_column("name") %>% 
    mutate(cyl = as_factor(cyl)) %>% 
    group_by(cyl) %>% 
    mutate(mpg=ifelse(cyl==4, sort(mpg), mpg),
           mpg=ifelse(cyl==8, sort(mpg, decreasing = TRUE), mpg)
    ) %>% 
    arrange(cyl)

# plot
ggbarplot(dfm, x = "name", y = "mpg",
          fill = "cyl",       # change fill color by cyl
          color = "white", # Set bar border colors to white
          palette = "jco",  # jco journal color palett.  
          x.text.angle = 90 # Rotate vertically x axis texts
)
 

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

Ответ №2:

Я не знаю, возможно ли это сделать в рамках ggbarplot функции ggpubr , но вот один из способов, манипулируя уровнями факторов.

Мы создаем фрейм данных ( order_data ), у которого есть порядок, в котором мы хотим, чтобы данные были отсортированы для каждой группы. Здесь я использую условность 1 в порядке возрастания, 0 в порядке отсутствия и -1 в порядке убывания.

 library(dplyr)
library(ggpubr)

order_data <- data.frame(cyl = factor(c(4, 6, 8)), order = c(1, 0, -1))
order_data

#  cyl order
#1   4     1
#2   6     0
#3   8    -1
 

Умножьте order значение на mpg данные и arrange данные, включите значения имен в качестве фактора на основе их возникновения и построения.

 dfm %>%
  left_join(order_data, by = 'cyl') %>%
  arrange(cyl, mpg * order) %>%
  mutate(name = factor(name, name)) %>%
  ggbarplot(x = "name", y = "mpg",
          fill = "cyl",       # change fill color by cyl
          color = "white", # Set bar border colors to white
          palette = "jco",  # jco journal color palett. 
          x.text.angle = 90 # Rotate vertically x axis texts
)
 

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