В R выведите среднее количество уникальных событий в год

#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 так на это легче смотреть):

d

Проблема

Я пытаюсь визуализировать, используя 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 для всего столбца «событие» и не сгруппированная по «идентификатору», таким образом, возвращает одно значение