2017-01-25 5 views
0

Ich habe zwei Datenrahmen:Suche nach einem Wert von einem Datenrahmen Spalte in einem zweiten Datenrahmen von Intervallen

CHR POS 
10 289968 
10 580270 

CHR START STOP 
10 250000 300000 
10 700422 700500 

Suche # 1

> subset(df1, CHR==df2$CHR & POS >= df2$START & POS <= df2$STOP) 
    CHR POS 
    1 10 289968 

Aber wenn ich die Reihenfolge der Zeilen in df2 Flip , dann funktioniert die Suche nicht. Zum Beispiel ist df2 jetzt wie folgt

CHR START STOP 
10 700422 700500 
10 250000 300000 

    > subset(df1, CHR==df2$CHR & POS >= df2$START & POS <= df2$STOP) 
    [1] CHR POS 
    <0 rows> (or 0-length row.names) 

Warum ist die Reihenfolge hier wichtig?

+0

Es ist, weil die Bedingung 'POS> = df2 $ Starten' (oder' CHR == df2 $ CHR' oder 'POS <= df2 $ STOP') vergleicht zwei Vektoren * * Element-für-Element **. Der logische Ausdruck gibt genau einen Vektor zurück, der angibt, welche Zeilen für das zweite Argument von "subset" zu behalten sind. – raymkchow

+1

Ich glaube nicht, dass ich das verstehe. Kannst du ein wenig weiterarbeiten? – cryptic0

+0

'df1 $ CHR == df2 $ CHR' gibt '[1] TRUE TRUE zurück, weil die ersten und zweiten Elemente von' df1 $ CHR' ('10') mit' df2 $ CHR' identisch sind. Die Reihenfolge ist wichtig, weil 'df1 $ POS> = df2 $ START' und 'df1 $ POS <= df2 $ STOP' ''1 FALSE TRUE' und' [1] TRUE FALSE' zurückgibt, nachdem Sie die Reihenfolge der Zeile umgedreht haben. anstelle von "[1] TRUE FALSE" und "[1] TRUE TRUE" vor dem Spiegeln. – raymkchow

Antwort

1

Für nicht leer für die Fragen, posten ich nur die Antwort.

Für jede Zeile von df1 Sie überprüfen müssen, wenn eine der Reihen von df2 die gegebenen Bedingung START <= POS <= STOP und Teilmenge df1 unter der Bedingung, basierend erfüllen.

Die Schritte sind die folgenden.
1. Verwenden Sie sapply mit einer Prüffunktion für jede Zeile df1.
2. subsetting mit subset

subset(df1, sapply(1:nrow(df1), 
     function(i) any(df1$CHR[i] == df2$CHR & df1$POS[i] >= df2$START & df1$POS[i] <= df2$STOP))) 
Verwandte Themen