R 如何过滤两个向量之间的时间戳
我是R的新手,正在尝试过滤雨后2小时内的降雨事件数据集。我尝试过编写一个函数来过滤,但失败了,但是有没有一种简单的方法可以用filter()或类似的东西来实现呢 到目前为止,我已经使用了过滤器(LRAIN>0)并尝试编写if条件,但失败了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(开始日期=时
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的较大数据集?谢谢!)@KodakAsisrain\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")