在使用 R 变异和替换 NA 时分配自定义数字

Assign a custom number while mutating and replacing NA using R

我有一个如下所示的数据框

id            date      from       to         type  
  <chr>      <date>     <date>     <date>     <chr>          
 1          2011-02-21 2011-01-01 2011-12-31 NA               
 2          2013-03-11 2013-01-01 2013-12-31 NA               
 3          2015-12-31 2015-01-01 2015-12-31 last             
 4          NA         NA         NA         NA                
 5          NA         NA         NA         NA  

我想计算我们可以向后或向前移动日期的范围。

我写了下面的代码,它适用于 Non-NA 场景,如下所示

     data %>%
        mutate(shift_back_max = (date - from) / ddays(1),
                 shift_forward_max = (to - date) / ddays(1)) %>%
        data[c("shift_back_max", "shift_forward_max")][is.na(data[c("shift_back_max", "shift_forward_max")])] <- 30   # error is here with the way I am replacing `NA` with 30

我想我面临的问题是在 %>% 操作任务期间替换 NA

对于 NA scenarios,我想分配 30-30 的自定义范围。

您可以将 NA 替换为 30(仅适用于这两列)或任何其他为 NA 输入 30 的方法也可以

我希望我的输出如下所示

identifier    date       from       to       type  shift_back_max shift_forward_max
                                            
1          2011-02-21 2011-01-01 2011-12-31 NA                51               313
2          2013-03-11 2013-01-01 2013-12-31 NA                69               295
3          2015-12-31 2015-01-01 2015-12-31 last             364                 0
4          NA         NA         NA         NA                30                30
5          NA         NA         NA         NA                30                30

对于这两列,您可以将 mutate 中的 NA 替换为 30 :

library(dplyr)
library(lubridate)

df %>%
  mutate(shift_back_max = (date - from) / ddays(1),
         shift_forward_max = (to - date) / ddays(1), 
         across(starts_with('shift'), tidyr::replace_na, 30))

#  id       date       from         to type shift_back_max shift_forward_max
#1  1 2011-02-21 2011-01-01 2011-12-31 <NA>             51               313
#2  2 2013-03-11 2013-01-01 2013-12-31 <NA>             69               295
#3  3 2015-12-31 2015-01-01 2015-12-31 last            364                 0
#4  4       <NA>       <NA>       <NA> <NA>             30                30
#5  5       <NA>       <NA>       <NA> <NA>             30                30