我正在清理一些纵向数据,我有几个丢失的案例。我试图使用一种包含失踪案件前后观察结果的插补方法。我想知道如何着手解决下面详述的问题。
我一直试图将问题分解为更小、更易于管理的操作和对象,然而,我不断找到的解决方案迫使我使用基于缺失值正上方和正下方行的条件格式,坦率地说,我有点不知道如何做到这一点。如果你认为你知道我可以使用、试验的一种好技术,或者如果你知道我在查找解决方案时可以使用的任何好的搜索词,我很乐意提供一些指导。
详细信息如下:
#Fake dataset creation
id <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4)
time <-c(0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6)
ss <- c(1,3,2,3,NA,0,0,2,4,0,NA,0,0,0,4,1,2,4,2,3,NA,2,1,0,NA,NA,0,0)
mydat <- data.frame(id, time, ss)
*粗体字符表示上方数据集的变化
这里的目标是找到一种方法来获得ID#1(变量ss)的NA值之前(3)和之后(0)的值的平均值,以便数据看起来像这样:
1,3,2,3,1.5,0,0,
ID#2(变量ss)应该如下所示:
2,4,0,0,0,0,0
ID#3(变量ss)应使用最后一次观测结转方法,因此需要如下所示:
4,1,2,4,2,3,3
ID#4(变量ss)具有两个连续的NA值,不应更改。它将被标记,以便在我的项目稍后进行不同的分析。因此,它应该是这样的:
2,1,0,NA,NA,0,0(没有变化)。
我使用了一个包smwrBase,下面是只填充1个缺失值的语法,但没有寻址id。
smwrBase::fillMissing(ss, max.fill=1)
动物园的套餐可能会更标准,但同样的问题。
zoo::na.approx(ss, maxgap=1)
下面是一种解释变量id的方法。目前的插值方法不喜欢填写最后一个值,所以我为此添加了一个手册if-stmt。有点暴力,因为可能有一种踢踏的方法。
> id <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4)
> time <-c(0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6,0,1,2,3,4,5,6)
> ss <- c(1,3,2,3,NA,0,0,2,4,0,NA,0,0,0,4,1,2,4,2,3,NA,2,1,0,NA,NA,0,0)
> mydat <- data.frame(id, time, ss, ss2=NA_real_)
> for (i in unique(id)) {
+ # interpolate for gaps
+ mydat$ss2[mydat$id==i] <- zoo::na.approx(ss[mydat$id==i], maxgap=1, na.rm=FALSE)
+ # extension for gap as last value
+ if(is.na(mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])])) {
+ mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])] <-
+ mydat$ss2[mydat$id==i][length(mydat$ss2[mydat$id==i])-1]
+ }
+ }
> mydat
id time ss ss2
1 1 0 1 1.0
2 1 1 3 3.0
3 1 2 2 2.0
4 1 3 3 3.0
5 1 4 NA 1.5
6 1 5 0 0.0
7 1 6 0 0.0
8 2 0 2 2.0
9 2 1 4 4.0
10 2 2 0 0.0
11 2 3 NA 0.0
12 2 4 0 0.0
13 2 5 0 0.0
14 2 6 0 0.0
15 3 0 4 4.0
16 3 1 1 1.0
17 3 2 2 2.0
18 3 3 4 4.0
19 3 4 2 2.0
20 3 5 3 3.0
21 3 6 NA 3.0
22 4 0 2 2.0
23 4 1 1 1.0
24 4 2 0 0.0
25 4 3 NA NA
26 4 4 NA NA
27 4 5 0 0.0
28 4 6 0 0.0
id=1中的插值是1.5(3和0的平均值),id=2是0(0和0的均值),并且id=3是3(前面的值,因为它没有后面的值)。