#r #ggplot2 #plot
Вопрос:
Фон
У меня есть кадр данных R d
:
d <- data.frame(ID = c("a","a","a","b","b","c","c","d"),
event = c("R2","R2","O99","B4","B4","A24","A24","J15"),
service_date = as.Date(c("2011-01-01","2011-07-12","2013-12-23","2011-04-27","2012-01-01","2012-07-12","2012-12-23","2013-04-27")),
stringsAsFactors=FALSE) %>% arrange(service_date, ID)
Это выглядит так (я arrange
проверил это, service_date
и ID
так на это легче смотреть):
Проблема
Я пытаюсь визуализировать, используя geom_bar
, сколько различных (т. Е. неповторяющихся или не дублирующихся) событий происходит в этом кадре данных в каждом году, но у меня возникли небольшие проблемы.
желаемый результат
Чтобы дать лучшее представление о том, чего я хочу , взгляните на первый год d
, который приходится на 2011 год. Вы видите 3 строки, но только 2 отдельных события, R2 и B4, потому что R2 повторяется один раз в строке 3. Тогда на гистограмме я хотел бы, чтобы первый столбец представлял 2011 год и показывал 2.
Если вы проведете подсчеты за оставшиеся 2 года, то каждый раз получите один и тот же результат. Итак, мне нужна гистограмма с 3 столбцами, представляющими 2011, 2012 и 2013 годы, каждый высотой 2, представляющими количество уникальных events
в кадре данных по всем ID
s.
РЕДАКТИРОВАТЬ Я вижу, что я не был ясен в своем описании желаемого результата. Приношу извинения читателям! Вот грубое визуальное изображение, выполненное в Excel:
Что я пробовал
Код, с которым я пытаюсь возиться, выглядит примерно так:
ggplot(data = d) geom_bar(aes(x = service_date, y = n_distinct(event)), stat = "identity")
Но это дает мне странный результат:
Я не женат ggplot
на этом, подойдет любая функция построения сюжета.
Комментарии:
1. Если вы хотите
n_distinct
работать с группами, вы должны сказать ему об этом. Прямо сейчас вы просто присваиваете количество различных значений событий во всем фрейме данных вашей шкале y; ничто в вашем коде не говорит об обратном2. Хорошо, спасибо. Дай мне посмотреть, смогу ли я
group_by
там как-нибудь работать.3. Эй, @akrun, извините, что я обновил свой пост, показав, как я хотел, чтобы он отображался, посмотрим, поможет ли это вам! (Кроме того, я вообще не голосовал против вас.)
Ответ №1:
Мы можем извлечь столбец year
из Date
класса «service_date», создать новый столбец «n» с количеством отдельных элементов из «события», а затем выполнить диаграмму
library(dplyr)
library(ggplot2)
library(lubridate)
d %>%
group_by(year = year(service_date)) %>%
summarise(n = n_distinct(event)) %>%
ggplot(aes(x = year, y = n))
geom_col()
-выход
Операция, используемая n_distinct
для всего столбца «событие» и не сгруппированная по «идентификатору», таким образом, возвращает одно значение