2017-07-03 64 views
2

基本上,我有一个非常大的数据帧/数据表,我想搜索一列的第一个和最接近的值,它小于我当前的索引位置。在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值的索引?

+1

'位置(is.na,head(dat $ KEY,8),right = TRUE)'也许? – thelatemail

+0

可能'max(which(is.na(df [df $ INDEX <= 8,] $ KEY)))'? – SymbolixAU

+0

'Position'方法是我还没有考虑过的,所以我会尝试一下并检查系统时间以查看其效率,谢谢!关于使用'max(尽管这是(is.na),我一直在使用该方法,但效率非常低,因为函数必须遍历整个列并在返回最大索引之前定位每个“NA”值。理想情况下,我想从索引位置向后搜索列,以便在搜索停止时遇到第一个“NA”值。 – ThePlowKing

回答

4

为什么不这样做的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 

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

+0

这是一个非常聪明的想法,它从来没有发生过,它也很容易实现!感谢那! – ThePlowKing

+0

或者另外一个选项是''动物园''(df,na.locf((NA ^!is.na(KEY))* INDEX,na.rm = FALSE)' – akrun

+0

什么是'as.integer(NA) ?为什么不'NA_integer_'? –