#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:
Вот еще один способ обработки первых данных:
- имена строк в первый столбец с
rownames_to_column
cyl
чтобы учесть- после группировки
sort
внутри групп сifelse
помощью оператора и - и важно
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
)