2016-10-19 4 views
5

私は必要に応じて整数に変換できる範囲の数値変数(Min、Max)に基づいてオーバーラップ範囲を持つオーバーラップ範囲を持つ行をフラグすることを検討しています。単一データフレーム内のオーバーラップ範囲

Class Min Max 
    A 100 200 
    A 120 205 
    A 210 310 
    A 500 630 
    A 510 530 
    A 705 800 

に変身:

Class Min Max Overlap 
    A 100 200  1 
    A 120 205  1 
    A 210 310  0 
    A 500 630  1 
    A 510 530  1 
    A 705 800  0 

私は多くの成功なしIRangesを試してみました - 任意のアイデア?私は重複を行うためdata.table非常に効果的な見つける

+1

あなたは、テストの重複のためのすべての間隔を対毎のしたいですか?これが本当に必要ですか? – Roland

+0

ロジックは次のように動作すると思う: 'overlap = [(minVal>他のmin)AND(minVal minVal)]' Right? – Bobby

+0

'IRanges'では' countOverlaps(IRanges(dat $ Min、dat $ Max))-1 'が必要です。 –

答えて

2

outerは、ペアワイズ比較を高速化するための選択肢です。間隔エンドポイントのペアワイズ比較はouterを使用して作成し、必要に応じて比較を組み合わせることができます。この場合、重複に必要な2つのルールが同時に真であるかどうかを確認します。

library(dplyr) 

df_foo = read.table(
textConnection("Class Min Max 
A 100 200 
A 120 205 
A 210 310 
A 500 630 
A 510 530 
A 705 800"), header = TRUE 
) 

c = outer(df_foo$Max, df_foo$Min, ">") 
d = outer(df_foo$Min, df_foo$Max, "<") 

df_foo %>% 
    mutate(Overlap = apply(c & d, 1, sum) > 1 
) 
+2

これはおそらくメモリがかなり早く消えてしまい、 'dplyr'とここに「1」のマージンを付けて「適用」しますか? 'df_foo $ Overlap < - rowSums(c&d)> 1'の何が問題なのですか? –

+0

@DavidArenburgメモリの使用に関する限り、私はあなたがこれより少なくすることはできないと思っていますが、それは他の答えが探求するためのものです。 – tchakravarty

+0

@DavidArenburgあなたの他の懸念事項として、それらはちょうどセマンティクスです。いずれかを使用することの実際の意味はありません。 – tchakravarty

2

は、データの再作成foverlaps

library(data.table) 
library(dplyr) 

使用:data.tableをキーイング

dt <- data.table(Class = c("A", "A", "A", "A", "A", "A"), 
      Min = c(100, 120, 210, 500, 510, 705), 
      Max = c(200, 205, 310, 630, 530, 800)) 

を、これが機能するために必要です。

setkey(dt, Min, Max) 

ここでは、foverlapsに対して、fiそれらと重なっている行を削除します。行数は、MinMaxでグループ化されます。 DavidArenburg

dt[dt_overlaps, Overlap := 1] 

結果

dt_overlaps <- foverlaps(dt, dt, type = "any")[Min != i.Min & Max != i.Max, .(Class, Overlap = .N), by = c("Min", "Max")] 

ありがとう:

> dt 
    Class Min Max Overlap 
1  A 100 200  1 
2  A 120 205  1 
3  A 210 310  NA 
4  A 500 630  1 
5  A 510 530  1 
6  A 705 800  NA 

あり、おそらくすっきりこのためdata.tableコードですが、私も学んでいます。

+2

'data.table'を使って結合をしたいのであれば、' dt [dt_overlaps 、Overlap:= 1]; dt'は 'dt'を修正します。しかし、このソリューションの問題は、データが十分に大きい場合は、OPがメモリ不足になる可能性があります。 –

+0

@DavidArenburgありがとうございます。 – zacdav

0
library(dplyr) 
df_foo%>%mutate(flag=coalesce(ifelse(Max>lead(Min),1,NA),ifelse(lag(Max)>Min,1,NA))) 
    Class Min Max flag 
1  A 100 200 1 
2  A 120 205 1 
3  A 210 310 NA 
4  A 500 630 1 
5  A 510 530 1 
6  A 705 800 NA 
関連する問題