根据不同列中的一系列值来改变列中的值

问题描述 投票:0回答:1

我有来自数据记录器的

tibble
温度数据,我想创建一个新列,最好使用
dplyr::mutate()
或其他一些
{tidyverse}
解决方案,在 12 小时内获得
NA
值。 一个问题是时间序列存在完全缺失的间隙(不仅仅是记录为
NA
),因此基于行索引的方法不起作用。必须使用时间范围来完成。

如何设置此

mutate
命令,以便对于缺少温度的 12 小时内的任何行返回
TRUE
,对于未记录在
FALSE
值附近的温度返回
NA

Reprex

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
的值。

r dplyr
1个回答
0
投票

很想看到更简洁的答案。

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  
© www.soinside.com 2019 - 2024. All rights reserved.