2017-07-03 1 views
2

基本的には、データフレーム/データテーブルが非常に大きく、現在のインデックス位置よりも小さい最初の最も近いNAの値を検索したいと考えています。例えばベクトル/データテーブルを後方に検索する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でNA値を持っており、インデックス5で、我々はインデックスから開始しましょう8(KEYは31である)。 KEYの列を検索して、NAの最初のインスタンスが見つかると、検索が停止し、NA値のインデックスが返されるようにします。

私はベクトル/列のすべてのNA値を見つけるための方法があります知っている(例えば、私はNAを持つインデックス値を返すためにwhich(is.na(x))を使用することができます)が、原因のデータフレームの規模の大きさに、私が働いていますし、実行する必要がある反復回数が多いため、これは非常に非効率的なやり方です。私が思った1つの方法は、ある種の "do while"ループを作成することです。それはうまくいくように見えますが、これは毎回計算を実行する必要があるため、やはり非常に効率が悪いように思えます(10万回以上繰り返す必要があることを考えれば良いアイデアのように見えません)。

特定のインデックスから逆方向に列を検索して、最も近いインデックスを見つけることができますか。NA値?

あなたは、将来の任意の行のために最新のNAを調べることができるように、一度NAインデックスの前方フィルをしないのはなぜ
+1

'Position(is.na、head(dat $ KEY、8)、right = TRUE)'おそらく? – thelatemail

+0

おそらく 'max(which.na(df [df $ INDEX <= 8、] KEY)))'? – SymbolixAU

+0

'Position'メソッドは私がまだ考慮していないものです。それを試し、システムの効率を確認する時間をチェックします、ありがとう!しかし、これは最大のインデックスを返す前に、関数がカラム全体を走査し、各 'NA'の値を見つけなければならないため、非常に非効率的です。理想的には、最初の「NA」値に遭遇した瞬間に検索が停止するように、インデックス位置から後方に列を検索したい。 – ThePlowKing

答えて

4

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

また、別のオプションは、 'doo、na.locf((NA ^!is.na(KEY))* INDEX、na.rm = FALSE)と' 'zoo''を使っています。' – akrun

+0

'' as.integer(NA) ' ?なぜ、NA_integer_はありませんか? –

関連する問題