Как заменить NA последним значением в несбалансированной панели?

Я хотел бы заменить NA на предыдущее значение в несбалансированных панельных данных (длинный формат). Перед заменой данные будут выглядеть так

Firm    Date    Var_1       
AAA 19990430    NA      
AAA 19990531    10      
AAA 19990630    NA      
AAA 19990731    NA      
AAA 19990831    12      
AAA 19990930    NA      
BBB 20040331    NA      
BBB 20040430    NA      
BBB 20040531    8       
BBB 20040630    NA      
BBB 20040731    NA      
BBB 20040831    12      
BBB 20040930    NA      

После это будет выглядеть так:

Firm    Date    Var_1       
AAA 19990430    NA      
AAA 19990531    10      
AAA 19990630    10      
AAA 19990731    10      
AAA 19990831    12      
AAA 19990930    12      
BBB 20040331    NA      
BBB 20040430    NA      
BBB 20040531    8       
BBB 20040630    8       
BBB 20040731    8       
BBB 20040831    12      
BBB 20040930    12

Дело в том, что две NA в начале фирмы BBB не должны заменяться цифрами из фирмы AAA. Заранее спасибо.


person Dylan    schedule 02.01.2017    source источник
comment
Для этого существует так много дубликатов. 1, 2, 3 и так далее.   -  person Ronak Shah    schedule 03.01.2017


Ответы (1)


Взгляните на zoo и функцию na.locf().

Допустим, ваш data.frame выше называется df.

df$Firm<-factor(df$Firm)
library(zoo)

#turn your df into a zoo object
df.zoo<-zoo(df)

#split on "Firm" and put df into a list.
df.list<-split(df.zoo,f=df.zoo$Firm)

#apply na.locf function to both Firms
df.list$`AAA`<-na.locf(df.list$`AAA`, na.rm=F)
df.list$`BBB`<-na.locf(df.list$`BBB`, na.rm=F)

#paste your df back together
rbind(
data.frame(na.locf(df.list$`AAA`, na.rm=F)),
data.frame(na.locf(df.list$`BBB`, na.rm=F))
)

Ты получишь

   Firm     Date Var_1
1   AAA 19990430  <NA>
2   AAA 19990531    10
3   AAA 19990630    10
4   AAA 19990731    10
5   AAA 19990831    12
6   AAA 19990930    12
7   BBB 20040331  <NA>
8   BBB 20040430  <NA>
9   BBB 20040531     8
10  BBB 20040630     8
11  BBB 20040731     8
12  BBB 20040831    12
13  BBB 20040930    12
person David    schedule 03.01.2017