我有来自数据记录器的
tibble
温度数据,我想创建一个新列,最好使用 dplyr::mutate()
或其他一些 {tidyverse}
解决方案,在 12 小时内获得 NA
值。
一个问题是时间序列存在完全缺失的间隙(不仅仅是记录为NA
),因此基于行索引的方法不起作用。必须使用时间范围来完成。
如何设置此
mutate
命令,以便对于缺少温度的 12 小时内的任何行返回 TRUE
,对于未记录在 FALSE
值附近的温度返回 NA
?
library(tibble)
temp.dat<-tibble(temperature=c(4,4.3,4.4,4.4,4.5,4.6,NA,NA,4.4,4.3),
date.time=c(
as_datetime("2012-09-29 18:00:00"),as_datetime("2012-09-30 00:00:00"),
as_datetime("2012-09-30 06:00:00"),as_datetime("2012-09-30 12:00:00"),
as_datetime("2012-09-30 18:00:00"),as_datetime("2012-10-01 00:00:00"),
as_datetime("2012-10-01 06:00:00"),as_datetime("2012-10-01 12:00:00"),
as_datetime("2012-10-01 18:00:00"),as_datetime("2012-10-02 00:00:00")))
# A tibble: 10 × 2
temperature date.time
<dbl> <dttm>
1 4 2012-09-29 18:00:00
2 4.3 2012-09-30 00:00:00
3 4.4 2012-09-30 06:00:00
4 4.4 2012-09-30 12:00:00
5 4.5 2012-09-30 18:00:00
6 4.6 2012-10-01 00:00:00
7 NA 2012-10-01 06:00:00
8 NA 2012-10-01 12:00:00
9 4.4 2012-10-01 18:00:00
10 4.3 2012-10-02 00:00:00
# A tibble: 10 × 3
temperature date.time censor
<dbl> <dttm> <chr>
1 4 2012-09-29 18:00:00 F
2 4.3 2012-09-30 00:00:00 F
3 4.4 2012-09-30 06:00:00 F
4 4.4 2012-09-30 12:00:00 F
5 4.5 2012-09-30 18:00:00 T
6 4.6 2012-10-01 00:00:00 T
7 NA 2012-10-01 06:00:00 T
8 NA 2012-10-01 12:00:00 T
9 4.4 2012-10-01 18:00:00 T
10 4.3 2012-10-02 00:00:00 T
我尝试过的示例
temp.dat%>%mutate(censor=if_else(NA %in%
temp.dat[match(c(date.time,
date.time-hours(6),
date.time+hours(6)), temp.dat$date.time),]$temperature,"T","F"))
但这会将每个观测值的
censor
值设置为 TRUE
。对我来说,棘手的事情是在由 temperature
定义的行范围内引用 date.time
的值。
很想看到更简洁的答案。
temp.dat |>
left_join(temp.dat |>
filter(is.na(temperature)) |>
transmute(before = date.time - hours(12),
after = date.time + hours(12),
censor = "T"),
join_by(closest(date.time >= before), date.time <= after)) |>
transmute(temperature, date.time, censor = coalesce(censor, "F"))
结果
# A tibble: 10 × 3
temperature date.time censor
<dbl> <dttm> <chr>
1 4 2012-09-29 18:00:00 F
2 4.3 2012-09-30 00:00:00 F
3 4.4 2012-09-30 06:00:00 F
4 4.4 2012-09-30 12:00:00 F
5 4.5 2012-09-30 18:00:00 T
6 4.6 2012-10-01 00:00:00 T
7 NA 2012-10-01 06:00:00 T
8 NA 2012-10-01 12:00:00 T
9 4.4 2012-10-01 18:00:00 T
10 4.3 2012-10-02 00:00:00 T