2017-01-07 5 views
0

Мои данные похожи на следующее:Дата ближе, но раньше, чем на определенную дату на основании другого фактора

data.frame(date=c("2013-07","2013-08","2013-09","2013-11", 
       "2013-11","2013-11","2014-02","2014-03"), 
     X=c("0","1","0","0","1","0","1","0")) 

    date x 
1 2013-07 0 
2 2013-08 1 
3 2013-09 0 
4 2013-11 0 
5 2013-11 1 
6 2013-11 0 
7 2014-02 1 

Я хочу создать новую функцию, которая показывает данные, не позднее текущей даты но ближе от текущей даты, когда х = 1

date  x lastdate 
1 2013-07 0  NA 
2 2013-08 1 2013-08 
3 2013-09 0 2013-08 
4 2013-11 0 2013-11 
5 2013-11 1 2013-11 
6 2013-11 0 2013-11 
7 2014-02 1 2014-02 
8 2014-03 0 2014-02 

ответ

1

Одним из эффективных решений может быть с помощью fintInterval и искать только в x == "1". Я добавил NA_character_ в начале для случая, когда findInterval возвращает ноль (как в первом ряду)

Некоторые методики explnation:

Основная идея здесь заключается в добавлении NA в начале df$date[df$X == "1"] а затем выполните поиск в оригинале df$date[df$X == "1"]. Всякий раз, когда значение в df$date перед всеми значениями в df$date[df$X == "1"], findInterval присваивает ему 0. Этот ноль должен стать NA в конечном счете, поэтому мы добавляем +1 ко всем инцидентам, найденным findInterval и ищем в пределах нового вектора (который содержит NA). Таким образом, все 0 s становятся 1 s и, следовательно, им присваивается NA, так как NA - это первое значение в новом векторе.

df[["lastdate"]] <- c(NA_character_, 
         as.character(df$date[df$X == "1"]))[findInterval(df$date, df$date[df$X == "1"]) + 1] 
df 
#  date X lastdate 
# 1 2013-07 0  <NA> 
# 2 2013-08 1 2013-08 
# 3 2013-09 0 2013-08 
# 4 2013-11 0 2013-11 
# 5 2013-11 1 2013-11 
# 6 2013-11 0 2013-11 
# 7 2014-02 1 2014-02 
# 8 2014-03 0 2014-02 

Или (это имеет dplyr тег)

library(dplyr) 
df %>% 
    mutate(lastdate = c(NA_character_, as.character(date[X == "1"]))[findInterval(date, date[X == "1"]) + 1]) 

Как примечание стороны, было бы, вероятно, легче работать с numericX скорее character один, и либо character или zoo::yearmon скорее factor (который трудно изменить) date столбец

+0

Можно ли добавить объяснение о том, как логика в вашем заявлении может построить это векторное приложение «lastdate» ropriately? Я потратил и час и изменил попытку собрать вместе, как 'findInterval()', и это утверждение работает вместе. К сожалению, я не могу оглянуться, как условная логика базы R решает вытащить из вектора «1» или вместо этого вытащить из вектора «findInterval + 1». –

+0

@leerssej Я добавил объяснение - надеюсь, что теперь это понятно. Как только обратите внимание, всякий раз, когда вы не понимаете какой-то определенный код, вы можете сначала затормозить его. Например, вы можете начать с поиска 'findInterval (df $ date, df $ date [df $ X ==" 1 "]) + 1' и т. Д. –

+0

Спасибо. Я разбил его на все свои компоненты; несколько раз фактически. Однако все отдельные части не складывались. Ваше объяснение полезно, поскольку, как я думаю, теперь я понимаю, что ваше решение, похоже, более или менее влагает свои векторы: итеративно добавляет к своей вершине, когда находит значения, которые были до их первого? –