2017-01-07 54 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"搜索。我在一開始的情況下添加NA_character_findInterval(你的第一行等)返回一個零

一些方法explnation:

這裏的基本思想是在df$date[df$X == "1"]開始添加NA然後在原始的df$date[df$X == "1"]向量內搜索。只要df$date中的值早於df$date[df$X == "1"]中的所有值,findInterval就會將其指定爲0。該零最終應該變爲NA,因此我們將+1添加到findInterval找到的所有事件中,並在新矢量(其中包含NA)內進行搜索。這樣,所有0 s變成1 s,因此,它們被分配NA s,因爲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一個上班,要麼characterzoo::yearmonfactor(難以修改)date

+0

是否可以添加關於語句中的邏輯如何構建「lastdate」向量應用程序的說明ropriately?我已經花費了一些時間,並且試着拼湊'findInterval()'和那個語句如何協同工作。不幸的是,我似乎無法圍繞基地R的條件邏輯如何決定從「1」向量拉或從「findInterval + 1」向量拉。 –

+0

@leerssej我已經添加了一個解釋 - 希望它現在更清晰。正如旁註所說,只要你不明白某個代碼,就可以先將它制動成碎片。例如,你可以先看看'findInterval(df $ date,df $ date [df $ X ==「1」])+ 1'等。 –

+0

謝謝。我把它分解成了所有的組件;實際上幾次。儘管如此,所有的個人作品都沒有加起來。你的解釋是有幫助的,因爲我認爲我現在明白你的解決方案似乎或多或少地嵌套它的向量:迭代地添加到它的「頂部」,因爲它發現它的第一個之前的值? –

相關問題