Как насчет двухкратного применения функции na.locf
от zoo
?
По сути, он заменяет NA
последним значением, вам также нужно вернуться назад.
Некоторые данные:
dat <- data.frame(
stkcd = rep(10, 10),
year = 2002:2011,
type = c(NA,NA, "E22", "E22","E22", "E22", "G45", "G45", NA, NA)
)
library(zoo)
dat$type <- na.locf(dat$type, na.rm = F) # computes NA with the last value found
dat$type <- na.locf(dat$type, na.rm = F, fromLast = T) # this because you start with NAs, so you need to go backwards too
# output:
# stkcd year type
# 1 10 2002 E22
# 2 10 2003 E22
# 3 10 2004 E22
# 4 10 2005 E22
# 5 10 2006 E22
# 6 10 2007 E22
# 7 10 2008 G45
# 8 10 2009 G45
# 9 10 2010 G45
# 10 10 2011 G45
Если у вас несколько компаний, сначала вам нужно group_by
, начиная с dplyr
:
library(dplyr)
library(zoo)
dat %>%
group_by(stkcd) %>% # the variable used for the company name
mutate(type = na.locf(type, na.rm = F),
type = na.locf(type, na.rm = F, fromLast = T))
Например, с 2 компаниями:
dat <- data.frame(
stkcd = c(rep(10, 10), rep(20,10)),
year = rep(2002:2011, 2),
type = c(NA,NA, "E22", "E22","E22", "E22", "G45", "G45", NA, NA,
NA,NA, "E22", "E22","E22", "E22", "G45", "G45", NA, NA)
)
dat %>%
group_by(stkcd) %>% # the variable used for the company name
mutate(type = na.locf(type, na.rm = F),
type = na.locf(type, na.rm = F, fromLast = T))
# A tibble: 20 x 3
# Groups: stkcd [2]
# stkcd year type
# <dbl> <int> <fct>
# 1 10 2002 E22
# 2 10 2003 E22
# 3 10 2004 E22
# 4 10 2005 E22
# 5 10 2006 E22
# 6 10 2007 E22
# 7 10 2008 G45
# 8 10 2009 G45
# 9 10 2010 G45
# 10 10 2011 G45
# 11 20 2002 E22
# 12 20 2003 E22
# 13 20 2004 E22
# 14 20 2005 E22
# 15 20 2006 E22
# 16 20 2007 E22
# 17 20 2008 G45
# 18 20 2009 G45
# 19 20 2010 G45
# 20 20 2011 G45