R 基于两个数据帧中的日期和条件对行进行子集设置

R 基于两个数据帧中的日期和条件对行进行子集设置,r,dataframe,subset,difftime,R,Dataframe,Subset,Difftime,我有一个数据框架,概述了从两个地点连续测量的污染水平 Dates <- as.data.frame(seq(as.Date("2015/01/01"), as.Date("2017/01/01"),"day")) Pollution_Site.A <- as.data.frame(c(seq(from = 1, to = 366, by = 1), (seq(from = 366, to = 1, by = -1)))) Pollutio

我有一个数据框架,概述了从两个地点连续测量的污染水平

Dates <- as.data.frame(seq(as.Date("2015/01/01"), as.Date("2017/01/01"),"day"))
Pollution_Site.A <- as.data.frame(c(seq(from = 1, to = 366, by = 1),
                       (seq(from = 366, to = 1, by = -1))))
Pollution_Site.B <- as.data.frame(c(seq(from = 0, to = 365, by = 1),
                                (seq(from = 365, to = 0, by = -1))))
df1 <- cbind(Dates,Pollution_Site.A,Pollution_Site.B)
colnames(df1) <- c("Dates","Site.A","Site.B")

Dates您需要透视
df1
,然后将其与
df2

library(dplyr)
library(tidyr)

df1 %>% gather(key=Site, value=Pollution, -Dates) %>% 
  group_by(Site) %>% 
  mutate(HighLimit=as.numeric(Pollution>1.5*median(Pollution))) %>% 
  filter(HighLimit==1) %>% 
  # this will function as cross-join because Site is not a unique ID
  left_join(df2, by=c("Site")) %>% 
  mutate(Time_Lag = as.numeric(as.Date(Survey_Dates)-as.Date(Dates)),
         Been_Before = ifelse(Time_Lag>0, "after", "before")) %>% 
  filter(abs(Time_Lag)<365) %>% 
  group_by(Site, Survey_Dates, Been_Before) %>% 
  summarise(Event_date_min=min(Dates), 
            Event_date_max=max(Dates))
库(dplyr)
图书馆(tidyr)
df1%%>%聚集(键=站点,值=污染,-日期)%%>%
分组依据(站点)%>%
变异(上限=数值(污染>1.5*中位(污染)))%>%
过滤器(上限==1)%>%
#这将作为交叉连接,因为站点不是唯一的ID
左连接(df2,by=c(“站点”))%>%
变异(时间滞后=作为数字(作为日期(调查日期)-作为日期(日期)),
Been_Before=ifelse(时间间隔>0,“之后”,“之前”))%>%
过滤器(abs(时间滞后)%
分组依据(现场、调查日期、之前去过)%>%
总结(事件日期分钟=分钟(日期),
事件\日期\最大值=最大值(日期))
在这里,您可以看到每次访问对应的最早和最新事件

# A tibble: 3 x 5
# Groups:   Site, Survey_Dates [?]
    Site Survey_Dates Been_Before Event_date_min Event_date_max
   <chr>       <dttm>       <chr>         <date>         <date>
1 Site.A   2016-08-01       after     2015-10-03     2016-04-01
2 Site.B   2015-02-01      before     2015-10-02     2016-01-30
3 Site.B   2016-10-31       after     2015-11-01     2016-04-02
#一个tible:3 x 5
#分组:现场、调查日期[?]
现场调查日期在事件之前事件日期最小事件日期最大
1现场A 2016-08-01 2015-10-03 2016-04-01之后
2现场B 2015-02-01 2015-10-02 2016-01-30之前
3现场B 2016-10-31 2015-11-01 2016-04-02之后

只需在上面显示的答案@dmi3kno的基础上,我就可以对包含每个站点的“before”和“after”符号的站点进行子集

Site<- c("Site.A","Site.A","Site.B","Site.B")
Survey_Dates <- as.data.frame(as.POSIXct(c("2014/08/17","2016/08/01",
                                      "2015/02/01","2016/10/31")))
df2 <- as.data.frame(cbind(Site,Survey_Dates))
colnames(df2) <- c("Site","Survey_Dates")
Output_df <- df1 %>% gather(key=Site, value=Pollution, -Dates) %>% 
group_by(Site) %>% 
mutate(HighLimit=as.numeric(Pollution>1.5*median(Pollution))) %>% 
filter(HighLimit==1) %>% 
left_join(df2, by=c("Site")) %>% 
mutate(Time_Lag = as.numeric(as.Date(Survey_Dates)-as.Date(Dates)),
     Been_Before = ifelse(Time_Lag>0, "after", "before")) %>% 
filter(abs(Time_Lag)<365) %>% 
group_by(Site, Survey_Dates, Been_Before) %>% 
summarise(Event_date_min=min(Dates), 
        Event_date_max=max(Dates))
Output_df%gather(key=Site,value=Pollution,-Dates)%>%
分组依据(站点)%>%
变异(上限=数值(污染>1.5*中位(污染)))%>%
过滤器(上限==1)%>%
左连接(df2,by=c(“站点”))%>%
变异(时间滞后=作为数字(作为日期(调查日期)-作为日期(日期)),
Been_Before=ifelse(时间间隔>0,“之后”,“之前”))%>%
过滤器(abs(时间滞后)%
分组依据(现场、调查日期、之前去过)%>%
总结(事件日期分钟=分钟(日期),
事件\日期\最大值=最大值(日期))
然后再次使用dplyr:

Final_df <- Output_df %>%
group_by(Site) %>%
filter(all(c("before", "after") %in% Been_Before))
Final_df%
分组依据(站点)%>%
过滤器(所有(c(“之前”、“之后”)%中的%before\u before))

你尝试了什么?你在哪里卡住了?我建议合并你的两个数据帧,然后取一些子集。谢谢你的评论。我已经把这个问题细分了一点。我以前使用过difftime函数来定义时间序列,但我不确定如何才能在这里使用它。
Final_df <- Output_df %>%
group_by(Site) %>%
filter(all(c("before", "after") %in% Been_Before))