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.locf
与 dplyr
动词一起使用。首先确保您 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
示例数据框:
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.locf
与 dplyr
动词一起使用。首先确保您 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