2017-01-25 53 views
0

的第二數據幀我有兩個數據幀:搜索從一個數據幀列中的值在時間間隔

CHR POS 
10 289968 
10 580270 

CHR START STOP 
10 250000 300000 
10 700422 700500 

搜索#1

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

但是,如果我翻轉在DF2行的順序,那麼搜索不起作用。例如,df2現在是這樣的

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) 

爲什麼順序在這裏?

+0

這是因爲條件'POS> = DF2 $ START'(或'CHR == DF2 $ CHR'或'POS <= $ DF2 STOP')比較兩個向量* *元素逐個元件**。邏輯表達式準確地返回一個向量,指示爲「subset」的第二個參數保留哪些行。 – raymkchow

+1

我不認爲我理解。你能詳細說一下嗎? – cryptic0

+0

'df1 $ CHR == df2 $ CHR'返回'[1] TRUE TRUE',因爲'df1 $ CHR'('10')的第一個和第二個元素與'df2 $ CHR'相同。順序很重要,因爲在您翻轉該行的順序後,df1 $ POS> = df2 $ START'和'df1 $ POS <= df2 $ STOP'返回'[1] FALSE TRUE'和'[1] TRUE FALSE',在翻轉之前,而不是「[1]真假」和「[1]真真」。 – raymkchow

回答

1

對於不留空白的問題,我只是發表答案。

對於df1的每一行,您需要檢查是否有任何行df2滿足給定條件START <= POS <= STOP和子集df1根據條件。

步驟如下。
1.對於df1的每一行,使用sapply以及檢查功能。
2.子集與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))) 
相關問題