在面板(横截面)时间序列上进行的最后观察(na.locf)

时间:2011-03-14 17:20:53

标签: r

是否有办法使用na.locf函数在横截面(面板)时间序列数据中填充NA值。

我的面板数据集设置类似于多年的数据,设置类似于以下内容:

library(zoo) #actual [r] code and data!
library(plm)
data(Produc)
a<-data.frame(Produc)
b<-subset(a,state=="WYOMING"|state=="WISCONSIN",select = state:hwy)  #limit to an easy subset)

数据有抑制(即政府数据机构未发布的缺失值),我想拉下一个观察值来填写NA值。

b[[2,4]]<-NA
b[[17,4]]<-NA
b[[18,3]]<-NA
c<-na.locf(b,na.rm=FALSE,fromLast=FALSE)

使用na.locf功能将填补NA,但没有什么可以阻止它错误地提取数据以填补去年城市的下一个城市的第一年数据。我开始认为我需要将数据框分成个别城市框架。

2 个答案:

答案 0 :(得分:2)

以AzadA的评论为基础

ddply标识数据框中的特定子集,并根据您选择的变量的级别将所需的函数应用于该子集中的所有部分。

库(plyr) new.data&lt; -a $(你想要将函数应用到的变量,以及订单和子集所需的变量) 格式:ddply(data.frame,var(s)是子集,函数,进一步的函数命令)

new.data&lt; - ddply(a,a $ city,na.locf)#apply na.locf by city in vector order to all vars

a $ b&lt; - new.data $ b#为每个变量执行此操作以交换旧信息

了解更多信息:http://cran.r-project.org/web/packages/plyr/plyr.pdf

答案 1 :(得分:0)

正如您所怀疑的那样,最简单的方法是将数据框划分为沿城市或年份维度的单独数据框(使用例如split),使用na.locf,然后unsplit

或者,如果您使用City作为rownames来构建数据可能会更容易,而使用Year作为名称(或反之亦然),并且每个数据都有一个矩阵列表。在这种情况下,您只需在适当的维度上使用apply to forward-fill。