我正在清洁某些数据以进行生存分析,我正在尝试使其成为基于给定主题中的周围值估算的丢失数据。我想使用参与者的最接近的和最接近的后续值的均值。如果没有后续值,那么我想使用以前的值,直到存在后续值为止。
我一直在试图将问题分解成较小,更易于管理的操作和对象,但是,我一直在迫使我使用有条件格式的解决方案,基于排和下方的条件格式,坦白说,我对如何做这件事有些损失。如果您认为您可以使用,尝试,或者您知道我可以使用的任何好的搜索词,我会喜欢的指导。
详细信息如下:
#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,0
ID#3(变量SS)看起来像:4,2,1,3,3,2,Na(无需更改,因为最终将删除具有NA的行)
ID#4(变量SS)看起来像:3,4,3, 3 , 1.5 ,0,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