Как в R извлечь переменную, совпадающую по двум условиям, внутри цикла? - PullRequest
0 голосов
/ 21 ноября 2019

Будучи новичком в R, я ищу эффективный способ выполнить цикл с аналогом VLOOKUP с двумя условиями. VLOOKUP позволяет искать определенное значение в столбце и применять его к каждой строке моего фрейма данных.

У меня есть длинный data.frame DF из 3 переменных:

  • Car: идентификационный номер наблюдаемых предметов (автомобилей). Уникальный для каждого автомобиля, но не для каждого ряда.
  • Date: дата наблюдения, формат = "% Y-% m-% d"
  • Area: логическая переменнаяпоказывая, было ли наблюдение (Car) на этом Date в определенной области (ИСТИНА) или нет (ЛОЖЬ)

Мне нужно создать новую двоичную переменную AreaChange, которая показывает если Area изменилось в следующие 10 дней для этого Car: если да, то 1, если без изменений, то 0. Меня также интересует одно направление изменения: с ЛОЖНОГО на ИСТИНА.

Возможно, что Area изменится несколько раз в течение следующих 10 дней, если хотя бы одно из изменений от ЛОЖНОГО до ИСТИНА, AreaChange должно равняться 1.

Это такжеВозможно, что некоторые Car с наблюдались в течение менее 10 дней в определенные периоды, в этих случаях также необходим расчет AreaChange.

Примерный набор данных может выглядеть следующим образом:

set.seed(1)
DF <- data.frame(
Cars=as.integer(sample(127345:127346, 2000, replace=T)), #2 cars sample
Date=as.Date
(seq(from = as.Date("2015-12-21"), to=as.Date("2017-01-30"), length.out = 2000)),
Area=as.logical(sample(x=c(0,1), prob=c(.7, .3), size=2000, replace=T)))
DF <- DF[!duplicated(DF[,c("Cars","Date")]),] #795 observations 

Для меня это выглядит так:

  1. Извлечение 10 FutureArea значений для каждой строки, совпадение по двум параметрам : то же самоеCar и Date между (Date и Date + 10). Я полагаю, что это можно сделать в формате loop за 10 дней.
  2. Создание новой двоичной переменной AreaChange, равной 0, если все доступные значения FutureArea совпадают, или если текущий Area для этой строки равен TRUE.

Iнашел предложения по случаям со слиянием 2 фреймов данных или по сопоставлению только по одному условию или без извлечения значений Area в будущие дни, но мне не удалось объединить их для моего случая.

На данный момент яудалось получить AreaChange, игнорируя необходимость совпадать с Car и сравнивая Area только с Area за 10 дней, а не за каждый день в течение следующих 10 дней.

DF$Date10 <- DF$Date+10
library(expss)
DF$Area10 <- vlookup(DF$Date10, DF[,1:3], result_column = 3, lookup_column = 2)
DF$AreaChange10 <- ifelse(DF$Area10!=DF$Area & DF$Area==FALSE, 1, 0)

Желаемым выводом является столбец AreaChange, например , как показано ниже :

  • равно 1, если между Date произошло переключение Area из FALSE в TRUEи Date + 10 для заданного Car, независимо от количества значений NA в эти дни,
  • равно 0 в противном случае.
Cars Date Area AreaDay0 AreaDay+1 AreaDay+2 AreaDay+3 AreaDay+4 AreaDay+5 AreaDay+6 AreaDay+7 AreaDay+8 AreaDay9 AreaDay+10 AreaChange Comment 
127345 12/21/15 TRUE 1 0 0 0 1 1 0 0 NA 1 0 1 yes,_as_includes_switch_from_0_to_1
127346 12/21/15 TRUE 1 1 1 0 0 0 0 0 0 0 0 0 no,_as_the_switch_is_from_1_to_0
127347 12/22/15 FALSE 0 0 0 0 0 0 0 0 0 0 0 0 no,_as_no_switch
127348 12/22/15 FALSE 0 0 0 0 0 0 0 NA 1 0 0 1 yes,_as_includes_switch_from_0_to_1
127349 12/23/15 TRUE 1 1 1 1 1 1 NA 1 1 1 1 0 no,_as_no_switch
127350 12/21/15 FALSE 0 NA NA NA NA NA NA NA NA NA 1 1 yes,_as_includes_switch_from_0_to_1

Большое спасибоза любые предложения о том, как оптимизировать и продолжить.

...