Векторизация для цикла разницы во времени в R - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть очень большой набор данных (df) событий, где каждая строка соответствует измерению, моменту времени (df$TimeSec) и идентификатору события (df$Source).

Цикл ниже создает столбец df$TimeDiff, который вычисляет разницу во времени между текущей отметкой времени строки и следующей. Он также проверяет, изменился ли Source, поэтому в первой строке нового события значение TimeDiff равно NA.

Я пытаюсь переключить свое мышление с цикла на использование векторизации R и надеюсь увеличить скорость обработки.

for(i in 1:nrow(df)){
  if(df$Source[i+1] == df$Source[i]){
    df$TimeDiff[i+1] <- df$TimeSec[i+1] - df$TimeSec[i]
  }else{
    df$TimeDiff[i+1] <- NA
  }
}

В итоге вышеприведенный цикл делает именно то, что я хочу, но я хочу посмотреть, есть ли лучший способ, который экономит время обработки. Спасибо!

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

В нескольких указателях для временных рядов используется библиотека ts или аналогичная. В базе R у нас есть функции diff и lag. Также функция ifelse упрощает векторизацию if(){}else{} предложений.

Для вашей конкретной проблемы вы можете сначала векторизовать оператор if:

cond <- diff(df$source) == 0 #if two sources are equal, their difference is 0

Далее мы можем выполнить весь расчет, используя один ifelse вызов

df$TimeDiff <- 0 #initial column value
df$TimeDiff[-1] <- ifelse(cond, diff(df$TimeSec), NA)

Это должно быть довольно быстро.

0 голосов
/ 26 апреля 2019

После некоторого копания я нашел другое решение, используя dplyr:

df %>% 
  group_by(Source) %>% 
  mutate(TimeDiff = TimeSec - lag(TimeSec))

Пробежал весь процесс в мгновение ока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...