Отфильтруйте столбец по интервалам в R и построите график с помощью ggplot ()

У меня есть следующий набор данных:

 dat<- structure(list(Year = c(1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 
 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L), Month = c(1L, 
 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 
 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L, 
 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
 12L), Day = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 
 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 
 26L, 27L, 28L, 29L, 30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 
 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 1L, 2L, 
 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 
 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 
 30L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 
 27L, 28L, 29L, 30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 
 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 1L, 2L, 3L, 4L, 5L, 6L, 
 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 
 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 1L, 
 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 
 29L, 30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 
 25L, 26L, 27L, 28L, 29L, 30L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 
 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 1L, 2L, 3L, 
 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 
 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 
 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 
 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 
 28L, 29L, 30L, 31L), Rainfall = c(1, 35.5, 20.3, 2.5, 32, 66.8, 
 0, 0, 1.8, 0, 5.3, 0, 0, 0, 11.7, 40.4, 45.7, 15.3, 21.6, 10.5, 
 26.2, 54.1, 1.5, 26.9, 39.4, 21.6, 1.3, 95.6, 10.2, 0, 5.1, 0, 
 4.1, 2.9, 0, 0.5, 2.1, 15.7, 14.2, 28.7, 134.2, 26.3, 0, 0, 0, 
 2.3, 0, 2.8, 0.3, 0.8, 0, 0, 1.8, 0, 0, 0.8, 0, 0, 3.3, 13.6, 
 32.9, 47.7, 1.8, 78.8, 27.1, 0, 0, 45.5, 2, 1.4, 0, 0.5, 0, 0, 
 19.8, 11.4, 8.7, 0, 0, 0, 4.8, 0, 2.5, 10.5, 24.7, 0.8, 10.4, 
 6.9, 13, 0, 0, 0, 3.1, 2.8, 23.9, 2.8, 0, 1.8, 7.4, 29.8, 0.5, 
 0, 0, 27, 16.5, 0, 6.9, 0, 0, 0, 0, 6.6, 0.6, 1.3, 0, 0, 9.7, 
 2, 15.3, 6.4, 11.1, 0.5, 16.8, 1.5, 0, 2.3, 1.3, 0, 3.6, 95.5, 
 3.4, 1.3, 35.3, 0, 1.3, 1.8, 0, 0, 0, 36.3, 0, 6.1, 1.8, 0, 4.8, 
 0, 0, 0, 0, 0, 0, 0, 0, 2.3, 5.9, 52.1, 2.5, 3.8, 15.7, 0, 7.9, 
 8.9, 0, 0, 5.6, 0, 26.2, 9.1, 22.6, 1.8, 17.5, 68.1, 0, 2.3, 
 3.1, 9.7, 105.9, 30.7, 3.8, 0, 31.2, 11.7, 0, 0, 18.8, 6.3, 3.6, 
 0, 0, 0, 0, 43.3, 0.5, 1.3, 49.3, 1, 0, 0, 0, 4.3, 6.4, 5.4, 
 0.3, 64.8, 0, 0, 0, 0, 0, 0, 38.1, 0, 8.4, 0, 0, 3.3, 0, 4.4, 
 1.6, 0, 0, 7.4, 0, 0.5, 0, 0, 0, 0.8, 1.5, 3.3, 0, 0, 0, 2, 0, 
 0, 6.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36.6, 45.2, 13.9, 5.1, 
 0, 0, 0, 1.8, 0, 0, 1.3, 0, 0, 0.5, 0, 0, 0, 2.3, 0, 0, 0, 25.7, 
 0, 3.6, 0.3, 0, 0, 0, 0, 0, 19.1, 22.1, 24.2, 0.5, 5.1, 0, 0, 
 0, 0, 0, 0, 2.3, 0, 0, 1.5, 11.5, 21.3, 28.2, 67.8, 55.7, 25.3, 
 2.3, 27.5, 0, 0, 14.2, 10.4, 12.7, 14.7, 9.7, 1.8, 0, 0, 0, 0, 
 0, 14.5, 0.5, 10.6, 0.5, 2, 1.5, 7.4, 14.3, 15.2, 0, 37.1, 18.3, 
 0.5, 3.3, 4.9, 68.6, 1.5, 0, 4.1, 20.1, 25.3, 23.9, 6.3, 26.2, 
 50.8, 15, 1.1, 44.2, 1.5, 0, 0, 0, 0, 14.5, 24.4, 0, 39.1, 151.7, 
 26.4, 1, 3.6, 2.5, 0, 1.3, 4.1, 7.1, 1.8, 7.6, 84.7, 1.5, 0)), row.names = c(NA, 
 365L), class = "data.frame")

Эти данные состоят из четырех столбцов: Год, Месяц, День, Осадки.

(1) Я хочу разделить эти данные по классам / категориям осадков:

1-20 mm/day
20-50 mm/day
50-100 mm/day
>100 mm/day

(2) Подсчитайте количество дней, выпадающих на каждую степень выпадения осадков в месяц, и нанесите полученные результаты в виде столбчатой ​​диаграммы с накоплением в R (месяцы по сравнению с количеством).

Что у меня есть на данный момент:

Прямо сейчас я фильтрую значения с помощью пакета dplyr. Вот пример за январь.

library(dplyr)
a<-filter(dat2,Rainfall>=1 &Rainfall <=20)
count(a[which(a$Month==1),])

Я делаю это ежемесячно по четырем категориям. Затем вручную сохраните счетчики.

Я хотел бы спросить, есть ли более эффективный и быстрый способ сделать это. Может быть, простой скрипт с построением графика в конце с помощью ggplot?

Буду признателен за любую помощь в этом вопросе.


person Lyndz    schedule 31.08.2020    source источник


Ответы (1)


Вы можете использовать cut для разделения Rainfall на сегменты и count для каждого Month и графика.

library(dplyr)
library(ggplot2)

dat %>%
  count(Month = factor(Month), 
        Rainfall = cut(Rainfall, c(-Inf, 20, 50, 100, Inf)), name = 'count') %>%
  ggplot() + aes(Month, count, fill = Rainfall) + geom_col()

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

person Ronak Shah    schedule 31.08.2020
comment
Я хотел бы спросить, как работает резка, скажем, для 1-20 мм и 20-50 мм. 20-50 мм на самом деле от 20,1 до 50 мм, не так ли? То есть ›20мм, а не› = 20мм? Это верно? - person Lyndz; 31.08.2020
comment
Да, это поведение по умолчанию, которое здесь используется. См. Этот пример, который может помочь прояснить ситуацию. cut(c(1.1, 2.2, 5.4, 5), c(-Inf, 2, 5, Inf)) - person Ronak Shah; 31.08.2020