【问题标题】:R -- Carry last observation forward n timesR -- 将最后一个观察结果向前 n 次
【发布时间】:2014-06-06 22:06:21
【问题描述】:

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

在下面的示例数据框中,我想为两行的每个 id 结转(传播)flag_aflag_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


【解决方案1】:

这不是最漂亮的事情,但这是我处理此类问题的方式:

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

【讨论】:

    【解决方案2】:

    您可以使用 imputeTS 包中 na.locf 的 ma​​xgap 选项来仅估算/填充小于特定大小的 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

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2015-10-27
      • 2020-06-14
      相关资源
      最近更新 更多