#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')