如何为r中的特定日期范围的行子集?

时间:2016-12-28 03:52:12

标签: r date

我是R的新手,目前正在处理一些降雨数据。我有两个名为df1和df2的数据帧。

 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

我想在df1中查找df2的日期。例如,如果df2中的第一个日期在df1中可用,我希望在该特定日期和之前3天的范围内对df1中的行进行子集化。如果该日期不可用,那么只需查看前3天。

如果前3天的数据不可用,则它将提取尽可能多的天数,但最大限制是在df2的特定日期之前3天。如果df1中没有可用的日期,则忽略该日期并在df2中查找下一个日期。另外,例如,2014年6月6日之前的3天可以在df1中获得,但我们已经考虑了2014年6月5日的那些日子。因此,2014年6月6日将被忽略。

结果数据框应如下所示:

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 个答案:

答案 0 :(得分:1)

这可能是完成任务的一种方法。如果我正确地阅读了您的问题,您希望删除任何日期,该日期与上一个日期的间隔时间不超过3天。通过这种方式,您可以避免在问题中提到的重叠问题;您可以成功删除2014年6月5日。在df2中过滤日期后,您可以为df1部分中修订后的df2中的每个日期分组lapply()。输出是一个列表,您希望为列表中的每个数据框指定名称。最后,绑定所有数据帧。

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
))