在 R 中向后搜索 vector/data table

Searching a vector/data table backwards in R

基本上,我有一个非常大的数据 frame/data table,我想在一列中搜索第一个也是最接近的 NA 值,该值小于我当前的值索引位置。

例如,假设我有一个数据框 DF 如下:

INDEX | KEY   |   ITEM
----------------------
 1    |  10   |    AAA
 2    |  12   |    AAA
 3    |  NA   |    AAA
 4    |  18   |    AAA
 5    |  NA   |    AAA
 6    |  24   |    AAA
 7    |  29   |    AAA
 8    |  31   |    AAA
 9    |  34   |    AAA

从这个数据框中,我们在索引 3 和索引 5 处有一个 NA 值。现在,假设我们从索引 8 开始(KEY 为 31)。我想向后搜索 KEY 列,以便在找到 NA 的第一个实例时搜索停止,并且 NA 值的索引是 returned。

我知道有一些方法可以在 vector/column 中找到所有 NA 值(例如,我可以使用 which(is.na(x)) 到 return 具有 NA) 但由于我正在工作的数据框的庞大规模以及需要执行的大量迭代,这是一种非常低效的方法。我想做的一种方法是创建一种 "do while" 循环,它似乎确实有效,但这似乎又很低效,因为它每次都需要执行计算(并且考虑到我需要进行超过 100,000 次迭代看起来不是个好主意)。

是否有一种从特定索引向后搜索列的快速方法,以便我可以找到最接近 NA 值的索引?

为什么不对 NA 索引进行一次前向填充,这样您就可以在将来查找任何行的最新 NA:

library(dplyr)
library(tidyr)

df = df %>%
    mutate(last_missing = if_else(is.na(KEY), INDEX, as.integer(NA))) %>%
    fill(last_missing)

输出:

> df
  INDEX KEY ITEM last_missing
1     1  10  AAA           NA
2     2  12  AAA           NA
3     3  NA  AAA            3
4     4  18  AAA            3
5     5  NA  AAA            5
6     6  24  AAA            5
7     7  29  AAA            5
8     8  31  AAA            5
9     9  34  AAA            5

现在,您无需每次需要给定行的答案时都重新计算。可能有更有效的方法来进行前向填充,但我认为探索这些方法比弄清楚如何优化向后搜索更容易。