R 如何过滤两个向量之间的时间戳

R 如何过滤两个向量之间的时间戳,r,filter,tidyverse,tibble,R,Filter,Tidyverse,Tibble,我是R的新手,正在尝试过滤雨后2小时内的降雨事件数据集。我尝试过编写一个函数来过滤,但失败了,但是有没有一种简单的方法可以用filter()或类似的东西来实现呢 到目前为止,我已经使用了过滤器(LRAIN>0)并尝试编写if条件,但失败了 foo <- if(Demo$LRAIN > 0) {as.vector(start_date = time) & as.vector(end_date = time + hour(2))} foo 0){as.vector(开始日期=时

我是R的新手,正在尝试过滤雨后2小时内的降雨事件数据集。我尝试过编写一个函数来过滤,但失败了,但是有没有一种简单的方法可以用filter()或类似的东西来实现呢

到目前为止,我已经使用了过滤器(LRAIN>0)并尝试编写if条件,但失败了

foo <- if(Demo$LRAIN > 0) {as.vector(start_date = time) & as.vector(end_date = time + hour(2))}
foo 0){as.vector(开始日期=时间)和as.vector(结束日期=时间+小时(2))}
此外,我也尝试过:

rain_start_time <- Demo$time[Demo$LRAIN > 0]
rain_end_time <- rain_start_time+hours(2)

Demo %>% filter(time > rain_start_time & time < rain_end_time)
rain\u start\u time 0]
雨水结束时间%过滤器(时间>雨水开始时间&时间<雨水结束时间)
但这并没有导致只返回rain\u start\u time和rain\u end\u time中每对日期之间的行

这是我的tibble的一部分,作为一个例子。我想保留“LRAIN”一栏中所示的降雨事件的所有信息(例如22:40:00的第一场降雨)加上接下来的两个小时

# A tibble: 6 x 10
  time                KILOPASCAL LRAIN RAWVOLWATER REFERENCE_KPA
  <dttm>                      <dbl> <dbl>       <dbl>         <dbl>
1 2019-07-26 22:30:00       -86.1  0          2259.          98.9
2 2019-07-26 22:40:00       -86.2  0.01       2258.          99.0
3 2019-07-26 22:50:00       -86.2  0.01       2258.          98.9
4 2019-07-26 23:00:00       -86.1  0          2259.          98.9
5 2019-07-26 23:10:00       -86.1  0          2258.          98.9
6 2019-07-26 23:20:00       -86.1  0          2259.          98.9
Demo %>%
  slice(-seq_len(which.max(LRAIN > 0) - 1)) %>%
  group_by(group = cumsum(LRAIN > 0)) %>%
  filter(time <= first(time) + hours(2))
#一个tible:6 x 10
时间(千帕斯卡)LRAIN RAWVOLWATER参考值
1 2019-07-26 22:30:00       -86.1  0          2259.          98.9
2 2019-07-26 22:40:00       -86.2  0.01       2258.          99
3 2019-07-26 22:50:00       -86.2  0.01       2258.          98.9
4 2019-07-26 23:00:00       -86.1  0          2259.          98.9
5 2019-07-26 23:10:00       -86.1  0          2258.          98.9
6 2019-07-26 23:20:00       -86.1  0          2259.          98.9

我希望有人能帮忙。已经非常感谢你了

LRAIN>0
filter
从该时间到接下来2小时的所有行时,您可以获得第一个
时间。在base R中,这可以按如下方式进行

rain_start_time <- df$time[which.max(df$LRAIN > 0)]
df[df$time >= rain_start_time & df$time <= rain_start_time + (2 * 60 * 60), ]

#                 time device_sn KILOPASCAL LRAIN RAWVOLWATER REFERENCE_KPA
#2 2019-07-26 22:40:00  z6-01968      -86.2  0.01        2258          99.0
#3 2019-07-26 22:50:00  z6-01968      -86.2  0.01        2258          98.9
#4 2019-07-26 23:00:00  z6-01968      -86.1  0.00        2259          98.9
#5 2019-07-26 23:10:00  z6-01968      -86.1  0.00        2258          98.9
#6 2019-07-26 23:20:00  z6-01968      -86.1  0.00        2259          98.0

编辑

要包含所有降雨事件,我们可以(使用数据帧名称作为
Demo
)删除第一行,直到没有降雨发生,然后在每个降雨间隔创建组,并选择在接下来两小时内发生的行

# A tibble: 6 x 10
  time                KILOPASCAL LRAIN RAWVOLWATER REFERENCE_KPA
  <dttm>                      <dbl> <dbl>       <dbl>         <dbl>
1 2019-07-26 22:30:00       -86.1  0          2259.          98.9
2 2019-07-26 22:40:00       -86.2  0.01       2258.          99.0
3 2019-07-26 22:50:00       -86.2  0.01       2258.          98.9
4 2019-07-26 23:00:00       -86.1  0          2259.          98.9
5 2019-07-26 23:10:00       -86.1  0          2258.          98.9
6 2019-07-26 23:20:00       -86.1  0          2259.          98.9
Demo %>%
  slice(-seq_len(which.max(LRAIN > 0) - 1)) %>%
  group_by(group = cumsum(LRAIN > 0)) %>%
  filter(time <= first(time) + hours(2))
Demo%>%
切片(-seq_len(which.max(LRAIN>0)-1))%>%
组别依据(组别=cumsum(LRAIN>0))%>%

过滤(时间使用
ifelse
而不是
if/else
我认为类似于:
library(dplyr);library(lubridate);Demo%>%filter(谢谢你,这似乎是正确的方法。但不幸的是,我的数据集包含许多降雨事件(向量降雨开始时间包含600个位置)每次我尝试过滤向量加上2小时,我的R会话就会中止。有没有办法使此过滤器适用于包含许多rainevents的较大数据集?谢谢!)@KodakAsis
rain\u start\u time
应该只有一个值,因为我们使用的是
which.max
,而不是
which
。无论如何,您想为所有rain\u事件保留接下来2小时的数据吗?因此在
22:40:00
后2小时和
22:50:00
后2小时共享的数据中?目前,我得到了答案提供的数据仅在第一场雨后2小时保存,即
22:40:00
@Ronakh Shah-True后2小时,谢谢,但我将其更改为“which”因为我需要过滤所有的rainevents+2小时。所以基本上我需要过滤每个日期的日期向量+2小时。我还想保留相邻降雨后的2小时,即22:40和22:50,可能在另一个步骤中删除由此重复的行。@KodakAsis您能在编辑部分检查更新的答案吗?看看它是否适合你。
df <- structure(list(time = structure(c(1564151400, 1564152000, 1564152600, 
1564153200, 1564153800, 1564154400), class = c("POSIXct", "POSIXt"
), tzone = ""), device_sn = structure(c(1L, 1L, 1L, 1L, 1L, 1L
), .Label = "z6-01968", class = "factor"), KILOPASCAL = c(-86.1, 
-86.2, -86.2, -86.1, -86.1, -86.1), LRAIN = c(0, 0.01, 0.01, 
0, 0, 0), RAWVOLWATER = c(2259, 2258, 2258, 2259, 2258, 2259), 
REFERENCE_KPA = c(98.9, 99, 98.9, 98.9, 98.9, 98)), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame")