2016-12-28 88 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