2017-01-07 1 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 

현재 날짜보다 이후 없는 데이터를 보여줍니다 그러나 현재 날짜에서 가장 가까운 X = 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" 내에서 검색 할 수있을 때. 기본적인 생각이 여기입니다

df$date[df$X == "1"]의 시작 부분에 NA을 추가 : findInterval

일부 방법론 explnation이 (당신의 첫 번째 행에서 같은) 0을 반환 할 때 나는 경우에 처음에 NA_character_를 추가했습니다 원래 df$date[df$X == "1"] 벡터 내에서 검색하십시오. df$date의 값이 df$date[df$X == "1"]의 모든 값보다 작을 때마다 findInterval0을 할당하십시오. 이 0은 결국 NA이되어야합니다. 따라서 findInterval에 의해 발견 된 모든 사건에 +1을 추가하고 새 벡터 (NA 포함) 내에서 검색합니다. 이 방법을 사용하면 0이 모두 1이되므로 NA이 새 벡터의 첫 번째 값이므로 NA이 지정됩니다. 측면이 오히려 numericXcharacter 하나의 작업을 아마 쉬울 것주의, 그리고

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 

또는

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

(이것은 dplyr 태그가) 중 하나 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

감사합니다. 나는 모든 것을 자체 구성 요소로 분해했다. 실제로 몇 번. 모든 개인적인 조각은 합병되지 않고 있었다. 당신의 설명이 도움이된다. 나는 이제 당신의 솔루션이 그 벡터를 어느 정도 중첩시키는 것처럼 보인다고 생각한다. 첫 번째 것보다 먼저 가치를 발견 할 때 반복적으로 '최상위'에 추가 하는가? –

관련 문제