2017-07-03 42 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_'? –