-1

我正在清理一些数据以进行生存分析,并且我正在努力做到这一点,以便根据给定主题内的周围值估算缺失的数据。我想为参与者使用最接近的先前值和最接近的后续值的平均值如果不存在后续值,那么我想使用前一个值结转直到存在后续值。

我一直试图将问题分解为更小、更易于管理的操作和对象,但是,我不断逼迫我使用基于缺失值上方和下方的行的条件格式的解决方案,坦率地说,我我对如何做到这一点有点茫然。如果您认为您知道我可以使用、试验的一种好技术,或者如果您知道我在查找解决方案时可以使用的任何好的搜索词,我希望得到一些指导。

详情如下:

#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(2,2,4,3,NA,0,0,1,4,0,NA,0,0,0,4,2,1,3,3,2,NA,3,4,3,NA,NA,0,0)
mydat <- data.frame(id, time, ss)

*粗体和下划线字符代表上述数据集的变化

这里的目标是找到一种方法让 ID #1(变量 ss)的 NA 值看起来像这样:2,2,4,3, 1.5 ,0,0

ID# 2(变量 ss)看起来像这样: 1,4,0​​, 0 ,0,0,0

ID #3(变量 ss)看起来像这样:4,2,1,3,3,2,NA(没有变化,因为带有 NA 的行最终将被删除)

ID #4(变量 ss)看起来像这样: 3,4,3, 3 , 1.5 ,0,0 (这需要多次更改,我希望它是最具挑战性的)。

4

1 回答 1

0

如果处理速度不是问题(我猜“ID #4”很难矢量化插补),那么也许可以尝试:

f <- function(x) {
  idx <- which(is.na(x))
  for (id in idx) {
    sel <- x[id+c(-1,1)]
    if (id < length(x)) 
      sel <- sel[!is.na(sel)]
    x[id] <- mean(sel)
  }
  return(x)                 
}
cbind(mydat, ss_imp=ave(mydat$ss, mydat$id, FUN=f))
#    id time ss ss_imp
# 11  1    0  2    2.0
# 12  1    1  2    2.0
# 13  1    2  4    4.0
# 14  1    3  3    3.0
# 15  1    4 NA    1.5
# 16  1    5  0    0.0
# 17  1    6  0    0.0
# 21  2    0  1    1.0
# 22  2    1  4    4.0
# 23  2    2  0    0.0
# 24  2    3 NA    0.0
# 25  2    4  0    0.0
# 26  2    5  0    0.0
# 27  2    6  0    0.0
# 31  3    0  4    4.0
# 32  3    1  2    2.0
# 33  3    2  1    1.0
# 34  3    3  3    3.0
# 35  3    4  3    3.0
# 36  3    5  2    2.0
# 37  3    6 NA     NA
# 41  4    0  3    3.0
# 42  4    1  4    4.0
# 43  4    2  3    3.0
# 44  4    3 NA    3.0
# 45  4    4 NA    1.5
# 46  4    5  0    0.0
# 47  4    6  0    0.0
于 2016-12-20T22:11:03.523 回答