【发布时间】:2014-06-06 22:06:21
【问题描述】:
我正在尝试将非缺失的观察结果向前推进并填充接下来的两个缺失的观察结果(尽管我认为这个问题的解决方案将广泛适用于将观察结果向前推进 n 行......)。
在下面的示例数据框中,我想为两行的每个 id 结转(传播)flag_a 和 flag_b 值。这是我的数据示例,其中包含所需的输出:
id <- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2)
flag_a <- as.numeric(c(NA, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, NA, NA, NA))
flag_b <- as.numeric(c(NA, NA, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, NA))
flag_a_desired_output <- as.numeric(c(NA, NA, 1, 1, 1, NA, NA, NA, NA, NA, NA, 1, 1, 1, NA, NA, NA, NA))
flag_b_desired_output <- as.numeric(c(NA, NA, NA, 1, 1, 1, NA, NA, NA, NA, NA, NA, NA, 1, 1, 1, NA, NA))
data <- data.frame(cbind(id, flag_a, flag_b, flag_a_desired_output, flag_b_desired_output))
我尝试使用以下最后一次观察结转 (LOCF) 功能;但是,正如预期的那样,它会填充所有缺失的行,而不仅仅是接下来的两行。
na.locf.na <- function(x, na.rm = FALSE, ...) na.locf(x, na.rm = na.rm, ...)
data <- transform(data, flag_a_locf = ave(flag_a, id, FUN = na.locf.na))
data <- transform(data, flag_b_locf = ave(flag_b, id, FUN = na.locf.na))
任何关于如何解决此问题的想法将不胜感激。
【问题讨论】:
-
id是干什么用的?这与您的问题有关吗? -
id是整个数据集中包含的每个唯一主题的标识符。我在此处包含它的原因是,如果flag_a仅在与该id关联的行的末尾之前出现一行,那么我不希望代码将来自id == 1的观察结果转发到第一个id == 2所在的行。这有意义吗?
标签: r missing-data