Построение нескольких двоичных переменных на одном и том же графике в ggplot

#r #ggplot2 #tidyverse

Вопрос:

Я надеюсь использовать ggplot для построения гистограммы частот (или просто % 1) группы двоичных переменных, и у меня возникли проблемы с их объединением на одном графике.

Все переменные вытекают из одного и того же вопроса в опросе, поэтому в идеале было бы неплохо иметь данные, которые содержат один столбец для этой переменной, но респонденты могли бы выбрать более одного варианта, и я надеюсь сохранить это вместо того, чтобы иметь «более одного выбранного» варианта. Вот фрагмент данных:

 structure(list(gender = structure(c("Male", "Male", "Female", 
"Female", "Female", "Female", "Male", "Male", "Male", "Male"), label = "Q4", format.stata = "$s"), 
    var1 = structure(c("0", "0", "1", "1", "0", "0", "0", "0", 
    "0", "0"), format.stata = "%9s"), var2 = structure(c("0", 
    "98", "1", "0", "0", "0", "0", "0", "0", "0"), format.stata = "%9s"), 
    var3 = structure(c("0", "0", "0", "0", "0", "0", "0", "0", 
    "0", "0"), format.stata = "%9s"), var4 = structure(c("1", 
    "0", "1", "0", "0", "0", "1", "1", "0", "0"), format.stata = "%9s"), 
    var5 = structure(c("1", "0", "0", "0", "0", "1", "0", "0", 
    "0", "0"), format.stata = "%9s")), row.names = c(NA, -10L
), class = c("tbl_df", "tbl", "data.frame"))
 

Комментарии:

1. Можете ли вы уточнить, что вы хотите построить на основе предоставленных данных? Мне непонятно, как вы хотите организовать свою предполагаемую диаграмму, учитывая данные примера. Кроме того … там должно быть 98 или должно быть все 1 и 0?

2. @chemdork123 Извините, 98 представляет собой недостающее значение. И идеальная диаграмма будет иметь var1, var2, var3 и т. Д. Вдоль оси x и с частотой или процентом 1 с вдоль y для каждого соответствующего var.

Ответ №1:

Получите данные в длинном формате, чтобы их было легче построить.

 library(tidyverse)

df %>%
  pivot_longer(cols = starts_with('var')) %>%
  group_by(name) %>%
  summarise(frequency_of_1 = sum(value == 1)) %>%
  #If you need percentage use mean instead of sum
  #summarise(frequency_of_1 = mean(value == 1)) %>%
  ggplot()   aes(name, frequency_of_1)   geom_col()
 

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


В базе R вы можете сделать это с colSums помощью и barplot .

 barplot(colSums(df[-1] == 1))
#For percentage
#barplot(colMeans(df[-1] == 1))
 

Комментарии:

1. Большое вам спасибо, это идеально. Есть ли простой способ включить каждое значение в разбивке (по признаку пола)? Не похоже, что это будет работать так же, как с таблицей, не являющейся сводной (которая будет просто ggplot(d, aes(x, заполнение = пол) или что-то еще)…

2. Вам нужно включить gender в group_by . Попробуй : df %>% pivot_longer(cols = starts_with('var')) %>%group_by(gender, name) %>%summarise(frequency_of_1 = sum(value == 1)) %>% ggplot() aes(name, frequency_of_1, fill = gender) geom_col(position = 'dodge')