我有一个包含许多缺失值的纵向数据集,我希望根据最后观察到的值'自动将其归入R中。继续前进,以及下一个观察到的价值'向后推。之前已经提出了类似的问题,但我想根据差距的长度添加特定的估算条件。
以下数据框(宽格式)演示了此问题:
miss.df <- data.frame(id = c('A','B','C','D','E'),
w1 = c(1,1,2,2,1),
w2 = c(1,NA,NA,2,NA),
w3 = c(NA,NA,NA,NA,2),
w4 = c(1,NA,NA,NA,NA),
w5 = c(1,2,NA,1,3),
w6 = c(1,2,1,NA,NA))
如此:
id w1 w2 w3 w4 w5 w6
1 A 1 1 NA 1 1 1
2 B 1 NA NA NA 2 2
3 C 2 NA NA NA NA 1
4 D 2 2 NA NA 1 NA
5 E 1 NA 2 NA 3 NA
请注意,数据是宽格式的,因此w1是第一波,等等。第一波完成没有丢失。值是分类变量(政党偏好)的数值。这些类别没有订单。因此,该数据框由仅有六个波的五个人的一个变量的信息组成。
我想要的条件如下:
如果要运行具有上述条件的循环,数据框将如下所示:
id w1 w2 w3 w4 w5 w6
1 A 1 1 1 1 1 1
2 B 1 1 1 2 2 2
3 C 2 2 2 1 1 1
4 D 2 2 2 1 1 1
5 E 1 1 2 2 3 3
提前致谢。
答案 0 :(得分:0)
嗯。棘手。而且我不知道任何有用的R泛型用于填写NA。最后,我认为最简单的方法是一个好的旧for
循环。逻辑是从左边填充一个,然后从右边填充一个,并重复此操作直到所有内容都填满。根本不是R - 它实际上可能是C代码 - 但除非你有多个行,否则应该没问题
fill_in_old_skool <- function (r) {
while (anyNA(r)) {
for (idx in seq_along(r)) {
val <- r[idx]
if (is.na(r[idx]) && idx > 1) r[idx] <- lastval
lastval <- val
}
for (idx in rev(seq_along(r))) {
val <- r[idx]
if (is.na(r[idx]) && idx < length(r)) r[idx] <- lastval
lastval <- val
}
}
r
}
miss.df[,-1] <- t(apply(miss.df[,-1], 1, fill_in_old_skool))
答案 1 :(得分:0)
imputeTS 包的功能与您想要的功能非常相似。
该函数名为 na.ma(x,k = 2,加权=“简单”)。
加权移动平均值缺失价值估算
基本上它对你的作用是: 如果您输入时间系列 x ,它会查找 k 下一个值,并将其平均值作为插补值。
不完全是您描述的内容,但我认为它可能类似于您提议的程序背后的想法。