Суммирование количества вхождений от м / д / у до у / м - PullRequest
0 голосов
/ 28 марта 2019

У меня есть данные от каждой из лавин, которые произошли.Мне нужно рассчитать количество лавин, которые произошли каждый год и месяц, но данные просто дают точные дни, когда лавина произошла.Как мне суммировать количество случаев, которые произошли в течение каждого года-месяца?Мне также нужны только зимние месяцы (декабрь (12) - март (3)).Пожалуйста, помогите!

library(XML)
library(RCurl)
library(dplyr)
avalanche<-data.frame()
avalanche.url<-"https://utahavalanchecenter.org/observations?page="
all.pages<-0:202
for(page in all.pages){
  this.url<-paste(avalanche.url, page, sep="")
  this.webpage<-htmlParse(getURL(this.url))
  thispage.avalanche<-readHTMLTable(this.webpage, which=1, header=T,stringsAsFactors=F)
  names(thispage.avalanche)<-c('Date','Region','Location','Observer')
  avalanche<-rbind(avalanche,thispage.avalanche)
}

# subset the data to the Salt Lake Region
avalancheslc<-subset(avalanche, Region=="Salt Lake")
str(avalancheslc)

Вывод должен выглядеть примерно так:

Date       AvalancheTotal
2000-01           1
2000-02           2
2000-03           8
2000-12           23
2001-01           16
.
.
.
.
.
2019-03            45

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Используя dplyr, вы можете получить интересующую переменную ("год-месяц") из столбца Дата, сгруппировать по этой переменной, а затем вычислить количество строк в каждой группе. Аналогичным образом вы можете фильтровать, чтобы получать только те месяцы, которые вам нравятся:

library(dplyr)
winter_months <- c(1:3, 12)

avalancheslc %>% 
    mutate(Date = as.Date(Date, "%m/%d/%Y")) %>% 
    mutate(YearMonth = format(Date,"%Y-%m"), 
           Month = as.numeric(format(Date,"%m"))) %>%
    filter(Month %in% winter_months) %>%
    group_by(YearMonth) %>%
    summarise(AvalancheTotal = n())

0 голосов
/ 28 марта 2019

Мы можем преобразовать в yearmon из zoo и использовать это в group_by для получения количества строк

library(dplyr)
library(zoo)

dim(avalancheslc)
#[1] 5494    4
out <- avalancheslc %>% 
          group_by(Date = format(as.yearmon(Date, "%m/%d/%Y"), "%Y-%m")) %>% 
          summarise(AvalancheTotal = n())

Если нам нужен только вывод от December до March, тогдаfilter данные

subOut <- out %>%
            filter(as.integer(substr(Date, 6, 7)) %in% c(12, 1:3))

Или это может быть filter ранее в цепочке

library(lubridate)
out <- avalancheslc %>%
         mutate(Date = as.yearmon(Date, "%m/%d/%Y")) %>%
         filter(month(Date) %in% c(12, 1:3))  %>% 
         count(Date)
dim(out)
#[1] 67  2

Теперь для заполнения нулями

mths <- month.abb[c(12, 1:3)]
out1 <- crossing(Months = mths, 
            Year = year(min(out$Date)):year(max(out$Date))) %>%
       unite(Date, Months, Year, sep= " ") %>% 
       mutate(Date = as.yearmon(Date)) %>% 
       left_join(out) %>% 
       mutate(n = replace_na(n, 0)) 

tail(out1)
# A tibble: 6 x 2
#  Date              n
#  <S3: yearmon> <dbl>
#1 Mar 2014        100
#2 Mar 2015         94
#3 Mar 2016         96
#4 Mar 2017         93
#5 Mar 2018        126
#6 Mar 2019        163
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...