Начинающий: установить временной ряд в R - PullRequest
0 голосов
/ 24 марта 2020

Я новичок в R, и мне сложно понять, как настроить простой временной ряд. Иллюстрация: скажем, у меня есть три переменные: событие (0 или 1), ЧСС (частота сердечных сокращений), DT (дата-время):

df = data.frame(Event = c(1,0,0,0,1,0,0),
                HR= c(100,120,115,105,105,115,100),
                DT= c("2020-01-01 09:00:00","2020-01-01 09:15:00","2020-01-01 10:00:00","2020-01-01 10:30:00",
                      "2020-01-01 11:00:00","2020-01-01 12:00:00","2020-01-01 13:00:00"),
                stringsAsFactors = F
)
  Event    HR DT                             
1     1   100 2020-01-01 09:00:00
2     0   120 2020-01-01 09:15:00
3     0   115 2020-01-01 10:00:00
4     0   105 2020-01-01 10:30:00
5     1   105 2020-01-01 11:00:00
6     0   115 2020-01-01 12:00:00
7     0   100 2020-01-01 13:00:00

То, что я хотел бы сделать, это рассчитать прошедшее время после каждое новое событие: Итак, row1 = 0 мин, row2 = 15, row3 = 60, ... row5 = 0, row6 = 60 Тогда я могу делать такие вещи, как сюжет HR против истекшего.

Что может быть простой способ рассчитать прошедшее время? Извиняюсь за столь низкий уровень вопроса, но был бы очень признателен за любую помощь!

Ответы [ 3 ]

1 голос
/ 24 марта 2020

Это однострочный подход с использованием data.table.

Данные:

df <- structure(list(Event = c(1, 0, 0, 0, 1, 0, 0), HR = c(100, 120, 
115, 105, 105, 115, 100), DT = structure(c(1577869200, 1577870100, 
1577872800, 1577874600, 1577876400, 1577880000, 1577883600), class = c("POSIXct", 
"POSIXt"), tzone = "UTC")), row.names = c(NA, -7L), class = "data.frame")

Код:

library(data.table)
dt <- as.data.table(df)
dt[, mins_since_last_event := as.numeric(difftime(DT,DT[1],units = "mins")), by = .(cumsum(Event))]

Выход:

dt
   Event  HR                  DT mins_since_last_event
1:     1 100 2020-01-01 09:00:00                     0
2:     0 120 2020-01-01 09:15:00                    15
3:     0 115 2020-01-01 10:00:00                    60
4:     0 105 2020-01-01 10:30:00                    90
5:     1 105 2020-01-01 11:00:00                     0
6:     0 115 2020-01-01 12:00:00                    60
7:     0 100 2020-01-01 13:00:00                   120
0 голосов
/ 24 марта 2020

Добро пожаловать в переполнение стека @greyguy. Вот подход с библиотекой dplyr, который довольно хорош для больших наборов данных:

library(dplyr)

#Yours Data

df = data.frame(Event = c(1,0,0,0,1,0,0),
                HR= c(100,120,115,105,105,115,100),
                DT= c("2020-01-01 09:00:00","2020-01-01 09:15:00","2020-01-01 10:00:00","2020-01-01 10:30:00",
                      "2020-01-01 11:00:00","2020-01-01 12:00:00","2020-01-01 13:00:00"),
                stringsAsFactors = F
)

# Transform in time format not string and order by time if not ordered

Преобразование в формате времени, а не в строку и порядок по времени, если не упорядочено

df = df %>% 
      mutate(DT = as.POSIXct(DT, format = "%Y-%m-%d %H:%M:%S")) %>% 
      arrange(DT) %>%
      mutate(#Litte trick to get last DT Observation
             last_DT = case_when(Event==1 ~ DT),
             last_DT = na.locf(last_DT),
             Elapsed_min = as.numeric( (DT - last_DT)/60)
             ) %>%
      select(-last_DT)

вывод:

# Event    HR                    DT   Elapsed_min
#     1   100   2020-01-01 09:00:00             0
#     0   120   2020-01-01 09:15:00            15
#     0   115   2020-01-01 10:00:00            60
#     0   105   2020-01-01 10:30:00            90
#     1   105   2020-01-01 11:00:00             0
#     0   115   2020-01-01 12:00:00            60
#     0   100   2020-01-01 13:00:00           120
0 голосов
/ 24 марта 2020

Следующее использует библиотеку Chron и преобразует ваш столбец даты / времени в объекты времени, чтобы библиотека могла выполнять вычисления и преобразования.

Пример данных:

df <- data.frame(
  Event=c(1,0,0,0,1,0,0),
  HR=c(100,125,115,105,105,115,100),
  DT=c("2020-01-01 09:00:00"
      ,"2020-01-01 09:15:00"
      ,"2020-01-01 10:00:00"
      ,"2020-01-01 10:30:00"
      ,"2020-01-01 11:00:00"
      ,"2020-01-01 12:00:00"
      ,"2020-01-01 13:00:00"))

код:

library(chron)

Dates <- lapply(strsplit(as.character(df$DT)," "),head,n=1)
Times <- lapply(strsplit(as.character(df$DT)," "),tail,n=1)

df$DT <- chron(as.character(Dates),as.character(Times),format=c(dates="y-m-d",times="h:m:s"))

df$TimeElapsed[1] <- 0

for(i in 1:nrow(df)){
  if(df$Event[i]==1){TimeStart <- df$DT[i]}
  df$TimeElapsed[i] <- (df$DT[i]-TimeStart)*24*60
}

выход:

> df
  Event  HR                  DT TimeElapsed
1     1 100 (20-01-01 09:00:00)           0
2     0 125 (20-01-01 09:15:00)          15
3     0 115 (20-01-01 10:00:00)          60
4     0 105 (20-01-01 10:30:00)          90
5     1 105 (20-01-01 11:00:00)           0
6     0 115 (20-01-01 12:00:00)          60
7     0 100 (20-01-01 13:00:00)         120
...