在R中向后搜索一个向量/数据表
基本上,我有一个非常大的数据帧/数据表,我想搜索一列的第一个和最接近的值,它小于我当前的索引位置。在R中向后搜索一个向量/数据表
例如,假设我有一个数据帧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值的索引。
我知道有由于我的工作数据帧的庞大规模的方式来找到一个向量/列的所有NA
值(例如,我可以用which(is.na(x))
返回具有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
现在,无需每次需要给定行的答案时重新计算。进行前向填充可能有更有效的方法,但我认为探索这些比找出如何优化后向搜索更容易。
这是一个非常聪明的想法,它从来没有发生过,它也很容易实现!感谢那! – ThePlowKing
或者另外一个选项是''动物园''(df,na.locf((NA ^!is.na(KEY))* INDEX,na.rm = FALSE)' – akrun
什么是'as.integer(NA) ?为什么不'NA_integer_'? –
'位置(is.na,head(dat $ KEY,8),right = TRUE)'也许? – thelatemail
可能'max(which(is.na(df [df $ INDEX SymbolixAU
'Position'方法是我还没有考虑过的,所以我会尝试一下并检查系统时间以查看其效率,谢谢!关于使用'max(尽管这是(is.na),我一直在使用该方法,但效率非常低,因为函数必须遍历整个列并在返回最大索引之前定位每个“NA”值。理想情况下,我想从索引位置向后搜索列,以便在搜索停止时遇到第一个“NA”值。 – ThePlowKing