在 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
现在,您无需每次需要给定行的答案时都重新计算。可能有更有效的方法来进行前向填充,但我认为探索这些方法比弄清楚如何优化向后搜索更容易。
基本上,我有一个非常大的数据 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
现在,您无需每次需要给定行的答案时都重新计算。可能有更有效的方法来进行前向填充,但我认为探索这些方法比弄清楚如何优化向后搜索更容易。