2016-12-28 89 views
1

我是R新手,目前正在處理一些降雨數據。我有兩個名爲df1和df2的數據框。如何爲r中特定日期範圍的行子集?

df1 

Date Duration_sum 
5/28/2014 110 
5/31/2014 20 
5/31/2014 20 
6/1/2014 10 
6/1/2014 110 
6/3/2014 140 
6/4/2014 40 
6/5/2014 60 
6/12/2014 10 
6/14/2014 100 

df2 

Date PercentRemoval 
6/2/2014 25.8 
6/5/2014 78.58 
6/6/2014 15.6 
6/13/2014 70.06 

我想從DF2查找的具體日期,DF1。例如,如果來自df2的第一個日期在df1中可用,我希望在該特定日期的範圍內且在此之前3天在df1中對行進行子集。如果該日期不可用,那麼只需查找前3天。

如果前3天的數據不可用,那麼它將提取儘可能多的天數,但最大限制是在df2的特定日期之前3天。如果df1中沒有可用的日期,則忽略該日期並在df2中查找下一個日期。另外,例如,2014年6月6日之前的3天以df1提供,但我們已經在6/5/2014之前考慮過那些日子。所以,6/6/2014被忽略了。

所得數據幀應該是這個樣子:

df3 

    col_1   Date  Duration_sum 
      5/31/2014   20 
      5/31/2014   20 
      6/1/2014   10 
6/2/2014  6/1/2014   110 
      6/3/2014   140 
      6/4/2014   40 
6/5/2014  6/5/2014   60 
6/13/2014 6/12/2014   10 

我已經使用這個代碼:

df3 <- df1[df1$Date %in% as.Date(c(df2)),] 

這段代碼讓我對具體的日期,但不是前3天的結果。我真的很感激如果有人可以幫我解決這個代碼或其他代碼。提前致謝。

回答

1

這可能是完成任務的一種方法。如果我正確地閱讀了您的問題,您希望刪除任何與前一個日期間隔不超過3天的日期。通過這種方式,您可以避免您在問題中提到的重疊問題;您可以成功刪除2014年6月5日。一旦在df2中篩選日期,您可以在lapply()部分修訂版df2中的每個日期對df1子集進行篩選。輸出是一個列表,並且您想要爲列表中的每個數據框指定名稱。最後,你綁定所有的數據幀。

library(dplyr) 

mutate(df1, Date = as.Date(Date, format = "%m/%d/%Y")) -> df1 

mutate(df2, Date = as.Date(Date, format = "%m/%d/%Y")) %>% 
filter(!(Date - lag(Date, default = 0) < 3)) -> df2 

lapply(df2$Date, function(x){ 
    filter(df1, between(Date, x-3, x)) -> foo 
    foo 
}) -> temp 

names(temp) <- as.character(df2$Date) 
bind_rows(temp, .id = "df2.date") 

# df2.date  Date Duration_sum 
#1 2014-06-02 2014-05-31   20 
#2 2014-06-02 2014-05-31   20 
#3 2014-06-02 2014-06-01   10 
#4 2014-06-02 2014-06-01   110 
#5 2014-06-05 2014-06-03   140 
#6 2014-06-05 2014-06-04   40 
#7 2014-06-05 2014-06-05   60 
#8 2014-06-13 2014-06-12   10 

DATA

df1 <- structure(list(Date = c("5/28/2014", "5/31/2014", "5/31/2014", 
"6/1/2014", "6/1/2014", "6/3/2014", "6/4/2014", "6/5/2014", "6/12/2014", 
"6/14/2014"), Duration_sum = c(110L, 20L, 20L, 10L, 110L, 140L, 
40L, 60L, 10L, 100L)), .Names = c("Date", "Duration_sum"), class = "data.frame", row.names = c(NA, 
-10L)) 

df2 <- structure(list(Date = c("6/2/2014", "6/5/2014", "6/6/2014", "6/13/2014" 
), PercentRemoval = c(25.8, 78.58, 15.6, 70.06)), .Names = c("Date", 
"PercentRemoval"), class = "data.frame", row.names = c(NA, -4L 
)) 
+0

太感謝你了!這正是我一直在尋找:) – Sami

+0

@Sami快樂來幫助你。 :) – jazzurro

+0

我非常需要你的幫助。如果我想解決此處提及的相同問題,會發生什麼情況,但在這種情況下,我不想從df2中刪除任何日期,該日期與df1中的前一個日期的間隔不超過3天。例如,在df2中,對於6/6/2014,在df1的3天範圍內有日期。所以,在這種情況下,我只想提取與之前的日期(6/5/2014)在df2中相同的值。 – Sami