R 将 NA 替换为按日期排序的组 ID 的最后一个值

R replace NA with last value for group ID ordered by date

示例数据框:

eg_data <- data.frame(
  custID = c('655321' , '655321' , '655321' , '655321' , '655321' , '655321' , '655321' , '655321' , '655321' , '655321' , '655321' , '655321' , '655321', '655321' , '655321' , '655321' , 
             '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' , '102013' ) ,
  year = c('2018' , '2018' , '2018' , '2018' , '2019' , '2019' , '2019' , '2019' , '2020' , '2020' , '2020' , '2020' , '2021' , '2021' , '2021' , '2021' , 
           '2018' , '2018' , '2018' , '2018' , '2019' , '2019' , '2019' , '2019' , '2020' , '2020' , '2020' , '2020' , '2021' , '2021' , '2021' , '2021') , 
  quarter = c('1' , '2' , '3' , '4' , '1' , '2' , '3' , '4' , '1' , '2' , '3' , '4' , '1' , '2' , '3' , '4', 
              '1' , '2' , '3' , '4' , '1' , '2' , '3' , '4' , '1' , '2' , '3' , '4' , '1' , '2' , '3' , '4') ,
  orderType = c('retail' , NA , 'wholesale' , NA , 'commercial' , 'retail' , NA , NA , NA , 'wholesale' , NA , NA , 'retail' , NA , NA , NA ,
                'wholesale' , NA , NA , 'retail' , 'commercial' , NA , 'commercial' , NA , NA , 'wholesale' , NA , 'retail' , 'retail' , NA , 'retail' , NA ) )

上下文: 数据是按年 + 季度细分的橡胶鸡订单。数据是针对两个客户的,但您可以假设还有更多客户,每个客户都有一个唯一的 ID 号。

共有三种订单类型 - 零售、批发和商业。订单类型字段中的值仅在订单类型更改时更新。

ID #655321 的 EG - 2019 年第二季度订单类型为零售,下一个值为 2020 年第二季度且为批发。 2019 年第 3 季度、2019 年第 4 季度和 2020 年第 1 季度的缺失值也是零售,但保留为 NA,因为订单类型保持季度不变。

我需要准确填写 NA 值。需具体到唯一身份证号,并按时间顺序排列。

我尝试了多种分组方法,但都没有成功。

在每个 ID 中,我需要解决方案来查看 orderType 字段,并且对于所有 NA 值都需要分配最后一个非 NA 值。

感谢任何帮助。非常感谢使用 tidyverse et al / dplyr 并避免使用函数的解决方案,但如果唯一的方法是创建一个函数,那很好。

谢谢

您可以将 zoo::na.locfdplyr 动词一起使用。首先确保您 group_by 客户 ID,并确保您的时间排序正确。

library(dplyr)

eg_data %>% 
  group_by(custID) %>% 
  arrange(custID, year, quarter) %>% 
  mutate(orderType = zoo::na.locf(orderType))

#> # A tibble: 32 x 4
#> # Groups:   custID [2]
#>    custID year  quarter orderType 
#>    <chr>  <chr> <chr>   <chr>     
#>  1 655321 2018  1       retail    
#>  2 655321 2018  2       retail    
#>  3 655321 2018  3       wholesale 
#>  4 655321 2018  4       wholesale 
#>  5 655321 2019  1       commercial
#>  6 655321 2019  2       retail    
#>  7 655321 2019  3       retail    
#>  8 655321 2019  4       retail    
#>  9 655321 2020  1       retail    
#> 10 655321 2020  2       wholesale 
#> # ... with 22 more rows