Будучи новичком в 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
Для меня это выглядит так:
- Извлечение 10
FutureArea
значений для каждой строки, совпадение по двум параметрам : то же самоеCar
и Date
между (Date
и Date
+ 10). Я полагаю, что это можно сделать в формате loop за 10 дней. - Создание новой двоичной переменной
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
Большое спасибоза любые предложения о том, как оптимизировать и продолжить.