Последовательные наблюдения по месяцам и годам - PullRequest
0 голосов
/ 15 октября 2018

Спасибо, ребята, за вашу помощь!Просто хочу получить помощь по последнему вопросу.Это мои данные ...

Year Month Day Hour   DateTime
1950  1     4   12    1/4/1950 12:00
1950  1     4   13    1/4/1950 13:00 
1950  1     4   14    1/4/1950 14:00 
1950  1     4   15    1/4/1950 15:00 
1950  1     4   18    1/4/1950 18:00 
1950  1     4   21    1/4/1950 21:00 
1950  1     4   22    1/4/1950 22:00 
1950  1     5   23    1/5/1950 23:00

Я разложил данные, чтобы вы могли видеть, какие данные идут с каким столбцом

Я использовал этот код ниже ..

rle (cumsum (c (TRUE, diff (dt, unit = "hour")! = 1))) $ lengths

для создания списка значений, обозначающего количество последовательныхнаблюдения.Так, например, первое значение равно 4 (потому что первые четыре наблюдения являются последовательными), затем 1, затем 3. Это именно то, что я хочу, но я бы хотел, чтобы эти значения были указаны по месяцам и годам.Например, я хотел бы, чтобы мой результат выглядел следующим образом ...

Year Month Consecutive 
1950   1      4 
1950   1      1 
1950   1      3

Где последовательный столбец соответствует количеству последовательных значений из приведенных выше данных, но также по годам и месяцам.Меня не волнует прекращение событий в конце месяцев или лет.В настоящее время я не знаю, где месяцы и годы, просто простой список последовательных сумм !!!Кроме того, спасибо за то, кто предоставил первый код!

1 Ответ

0 голосов
/ 15 октября 2018

Мы можем делать с группой по операции (при условии, что DateTime преобразуется в datetime класс)

library(dplyr)
library(tidyr)
df1 %>%
   mutate(DateTime = as.POSIXct(DateTime, format = "%m/%d/%Y %H:%M")) %>%
   group_by(Year, Month) %>% 
   summarise(Consecutive = list(rle(cumsum(c(TRUE, 
         diff(DateTime, unit = "hour") != 1)))$lengths)) %>%
   unnest

data

df1 <- structure(list(Year = c(1950L, 1950L, 1950L, 1950L, 1950L, 1950L, 
1950L, 1950L), Month = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), Day = c(4L, 
 4L, 4L, 4L, 4L, 4L, 4L, 5L), Hour = c(12L, 13L, 14L, 15L, 18L, 
 21L, 22L, 23L), DateTime = c("1/4/1950 12:00", "1/4/1950 13:00", 
 "1/4/1950 14:00", "1/4/1950 15:00", "1/4/1950 18:00", "1/4/1950 21:00", 
 "1/4/1950 22:00", "1/5/1950 23:00")), class = "data.frame",
 row.names = c(NA, -8L))
...