首页 > 解决方案 > 将 maxgap 更改为结转值的次数

问题描述

我有一个类似于以下的数据框:

library(data.table)
test <- data.table(data.frame("value" = c(5,NA,8,NA,NA,8,6,NA,NA,10),
                              "locf_N" = c(1,NA,1,NA,NA,1,2,NA,NA,2)) )

在这个数据框中,我有一个变量,它指示我可以将最后一次观察 (locf_N) 结转的时间。这不是所有观察的固定数字。为此,我尝试在 na.locf 函数中使用 maxgap 参数,但它实际上并不是我想要的。

require(zoo)
test[,value := na.locf(value, na.rm = FALSE, maxgap = 1)]
test[,value := na.locf(value, na.rm = FALSE, maxgap = locf_N)]

有没有参数可以设置最后一次观察可以结转的次数?欢迎任何想法。

期望的输出:

output <- data.table(data.frame("value" = c(5,5,8,8,NA,8,6,6,6,10),
                                "locf_N" = c(1,NA,1,NA,NA,1,2,NA,NA,2)) )

标签: rnazoolocf

解决方案


cumsum(!is.na(value))是将每个非 NA 与以下 NA 分组的分组向量。然后对于每个这样的组,重复第一个值所需的次数,并将剩余的值保留为 NA。

test[, list(value = replace(value, 1:min(.N, locf_N[1] + 1), value[1]), locf_N), 
        by = cumsum(!is.na(value))][, -1]

给予:

    value locf_N
 1:     5      1
 2:     5     NA
 3:     8      1
 4:     8     NA
 5:    NA     NA
 6:     8      1
 7:     6      2
 8:     6     NA
 9:     6     NA
10:    10      2

推荐阅读