Определение того, находится ли дата / время из одного кадра данных в течение часа после другого кадра данных - PullRequest
0 голосов
/ 01 июля 2018

У меня есть 2 кадра данных, A и B:

A

abc|def|datetime            |
1  |55 |2016-01-28 00:00:00 |
2  |53 |2016-01-28 00:30:00 |
3  |11 |2016-01-28 02:00:00 |

B

efg|hij|datetime            |
4  |ch |2016-01-28 00:11:00 |
5  |jw |2016-01-28 11:30:00 |
6  |q1 |2016-01-28 07:00:00 |

I Я хочу добавить истинный ложный столбец в конец A, если значение B находится в течение часа после. А также столбец, который показывает значение B, находится в течение часа до этого.

Выход:

abc|def|datetime            |After|Before|
1  |55 |2016-01-28 00:00:00 |  0  |  1   |
2  |53 |2016-01-28 00:30:00 |  1  |  0   |
3  |11 |2016-01-28 02:00:00 |  0  |  0   |

Я пытался использовать `library (lubridate):

for(i in seq(nrow(B))){
  for(j in seq(nrow(A))){
    if(A$datetime[j] %in% seq(B$datetime[i],B$datetime[i] + hours(1))){
      A$After[j] = 1
    }
  }
}

Но я не могу заставить его работать. Любая помощь будет очень ценной.

Дополнительная информация:

Фреймы данных не совпадают, я хочу определить, есть ли какие-либо случаи в B, которые находятся в течение часа после или до A. Если это так, то добавьте 1 к столбцу. например:

4 |ch |2016-01-28 00:11:00 | после 1 |55 |2016-01-28 00:00:00 |

4 |ch |2016-01-28 00:11:00 | до 2 |53 |2016-01-28 00:30:00 |

B - это событие, и я хочу определить это событие по отношению к A.

1 Ответ

0 голосов
/ 01 июля 2018

Отредактированный вопрос, основанный на дополнительной информации. В этом случае это немного проще. Вы можете использовать функции из lubridate, чтобы найти наши, если datetime попадает между 2 датами. Вам нужно 2 функции для этого. Сначала создайте объект интервала, а затем воспользуйтесь функцией %within%, чтобы узнать, попадает ли дата в интервал.

В приведенном ниже коде я создал 2 объекта интервала, До и После. Чтобы проверить, попадает ли каждое значение B в один из интервалов, нам нужно запустить цикл.

library(lubridate)

after_interval <- as.interval(3600, A$datetime)
# flip interval to get lower date first in the interval
before_interval <- int_flip(as.interval(-3600, A$datetime)) 

for(i in seq_along(length(B$datetime))) {
  After <- B$datetime[i] %within% after_interval
  After = as.integer(After)
  if(i == 1){
    AfterLoop = After
  } else {
      AfterLoop = AfterLoop + After}

  Before <- B$datetime[i] %within% before_interval 
  Before = as.integer(Before)
  if(i == 1){
    BeforeLoop = Before
  } else {
      BeforeLoop = BeforeLoop + Before}
}
A$After <- AfterLoop
A$Before <-BeforeLoop
A
  abc def            datetime After Before
1   1  55 2016-01-28 00:00:00  TRUE  FALSE
2   2  53 2016-01-28 00:30:00 FALSE   TRUE
3   3  11 2016-01-28 02:00:00 FALSE  FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...