R - 向前进行最后一次观察n次

时间:2014-06-06 22:06:21

标签: r missing-data

我试图向前推进非缺失的观察并填充接下来的两个缺失的观察结果(尽管我想这个问题的解决方案将广泛适用于通过n行进行观察......)。

在下面的示例数据框中,我希望继续(传播)两行的每个flag_a的{​​{1}}和flag_b值。以下是包含所需输出的数据示例:

id

我试图使用以下最后一次观察结果(LOCF)功能;但是,正如预期的那样,它会填充所有缺失的行,而不仅仅是接下来的两行。

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))

对于如何解决这个问题的任何想法都将非常感激。

2 个答案:

答案 0 :(得分:3)

这不是最漂亮的事情,但这就是我如何处理这样的问题:

library(data.table)
data <- data.table(data)
data[, rowid:=1:.N, keyby = id]

## flag_a
data[, flag_a_min:=min(rowid[!is.na(flag_a)]), keyby = id]
data[, flag_a_max:=flag_a_min+2]
data[rowid <=flag_a_max & rowid >= flag_a_min, flag_a:=min(na.omit(flag_a))]

## flag_b
data[, flag_b_min:=min(rowid[!is.na(flag_b)]), keyby = id]
data[, flag_b_max:=flag_b_min+2]
data[rowid <=flag_b_max & rowid >= flag_b_min, flag_b:=min(na.omit(flag_b))]

## clean up
data[, c("rowid", "flag_a_min", "flag_a_max", "flag_b_min", "flag_b_max"):=NULL]

> data
    id flag_a flag_b flag_a_desired_output flag_b_desired_output
 1:  1     NA     NA                    NA                    NA
 2:  1     NA     NA                    NA                    NA
 3:  1      1     NA                     1                    NA
 4:  1      1      1                     1                     1
 5:  1      1      1                     1                     1
 6:  1     NA      1                    NA                     1
 7:  1     NA     NA                    NA                    NA
 8:  1     NA     NA                    NA                    NA
 9:  1     NA     NA                    NA                    NA
10:  1     NA     NA                    NA                    NA
11:  2     NA     NA                    NA                    NA
12:  2      1     NA                     1                    NA
13:  2      1     NA                     1                    NA
14:  2      1      1                     1                     1
15:  2     NA      1                    NA                     1
16:  2     NA      1                    NA                     1
17:  2     NA     NA                    NA                    NA
18:  2     NA     NA                    NA                    NA

答案 1 :(得分:0)

您可以在软件包 imputeTS 中使用na.locf的 maxgap 选项来仅填充/填充小于特定大小的NA间隙。 (此解决方案将使更长的NA差距保持不变)

例如

library(imputeTS)
na_locf(input, maxgap = 2)

仅将结转后的观测值(locf)应用于小于2个连续NA的NA间隙。

2,3,NA,NA,NA,5,5只会保留2,3,NA,NA,NA,5,5

同时

2,3,NA,5,5,5,5将成为2,3,3,5,5,5,5