我是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天的结果。我真的很感激如果有人可以帮我解决这个代码或其他一些代码。提前谢谢。
答案 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
))