у меня есть фрейм данных в R под названием df:
df
Item Strongly Disagree Disagree So So Agree Strongly Agree
1 BRAZIL 13.33333 25.83333 15.83333 15.83333 29.16667
2 GERMANY 20.00000 20.00000 20.00000 10.00000 30.00000
3 ITALY 40.00000 0.00000 60.00000 0.00000 0.00000
4 USA 0.00000 16.25000 22.50000 28.75000 32.50000
Я хочу создать график в масштабе Лайкерта, используя ggplot2 или gglikert из ggstats. В частности, я хочу, чтобы по оси Y были страны, а по оси X - уровни Лайкерта. Но я хочу, чтобы меня сортировали в порядке убывания в соответствии с очень левыми пропорциями, которые представляют собой комбинацию (сумму) двух нижних уровней. (т.е. соответственно проценты справа в сумме двух высших категорий будут в порядке возрастания).
Как я могу сделать это в R, используя gglikert?
данные :
dput(df)
structure(list(Item = c("BRAZIL", "GERMANY", "ITALY", "USA"),
`Strongly Disagree` = c(15, 20, 40, 13.3333333333333), Disagree = c(15,
40, 40, 20), `So So` = c(20, 10, 20, 13.3333333333333), Agree = c(15,
20, 0, 40), `Strongly Agree` = c(35, 10, 0, 13.3333333333333
)), row.names = c(NA, -4L), class = "data.frame")
@Эдвард, извини, то же самое. Я отредактировал.
@Роман, мне жаль, что данные dput(df)
были неверными. Я отредактировал.
с этого момента: df %>% pivot_longer(-c(Item)) %>% ggplot(aes(value, Item, fill = name)) + geom_col()
чего ты хочешь?
@Roman Будет отсортировано, как я объяснил в ОП. кстати, мне не нужен составной столбчатый график
Можешь попробовать
library(tidyverse)
library(ggstat)
likert_levels <- c(
"Strongly Disagree",
"Disagree",
"So So",
"Agree",
"Strongly Agree"
)
df %>%
pivot_longer(-c(Item)) %>%
mutate(value = ifelse(Item == "USA" & name == "Strongly Agree", 14, value)) %>%
split(.$Item) %>%
map2_dfc(., names(.), ~tibble(rep(.x$name,times = round(.x$value))) %>% set_names(.y)) %>%
mutate(across(everything(), ~ factor(.x, levels = likert_levels))) %>%
gglikert(sort = "descending")
Для сортировки по нижним границам вы можете использовать этот ответ: отсортируйте диаграмму Ггликерта по процентам комбинаций в R
df %>%
pivot_longer(-c(Item)) %>%
mutate(value = ifelse(Item == "USA" & name == "Strongly Agree", 14, value)) %>%
split(.$Item) %>%
map2_dfc(., names(.), ~tibble(rep(.x$name,times = round(.x$value))) %>% set_names(.y)) %>%
mutate(across(everything(), ~ factor(.x, levels = likert_levels))) %>%
gglikert(sort = "ascending") +
aes(y = reorder(.question,
ifelse(
.answer %in% c("Strongly disagree", "Disagree"),1, 0),
FUN = sum))
Почему вы устанавливаете ifelse(Item == "USA" & name == "Strongly Agree", 14, value)
. Есть ли еще какой-нибудь автоматический способ сделать это? Также 33% должно быть ниже 30%. Но что еще более важно, я не получаю никакого графика. Просто пустая панель со странами по оси Y. Warning messages: 1: Computation failed in
stat_prop(). Caused by error in
aggregate.data.frame(): ! no rows to aggregate 2: Computation failed in
stat_prop(). Caused by error in
aggregate.data.frame(): ! no rows to aggregate 3: Removed 8 rows containing missing values or values outside the scale range (
geom_text()).
1. Проценты должны в сумме составлять 100%. 2. попробуйте затем в порядке возрастания 3. Вы установили >R версию 4.3.0?
у меня установлена 4.3.3. Проблема сохраняется
ах. Извините, вам нужно указать уровни. Обновил ответ.
ок, но 33% все равно появляются выше 30%. В порядке возрастания не помогает.
Какой фрейм данных вы хотите использовать (DF или df)?