2017-04-03 100 views
1

我有兩個DFS如下查找並標記範圍

>codes1 

Country  State      City Start No End No 
IN   Telangana    Hyderabad 100  200 
IN  Maharashtra  Pune (Bund Garden) 300  400 
IN   Haryana     Gurgaon 500  600 
IN  Maharashtra      Pune 700  800 
IN   Gujarat Ahmedabad (Vastrapur) 900  1000 

現在我想從表中標記的IP地址1

>codes2 

ID  No 
1  157 
2  346 
3  389 
4  453 
5  562 
6  9874 
7  98745 

現在我想在codes2 DF標記號之間的號按照在codes1 DF給出無柱的範圍內,預期輸出中是

ID  No Country  State   City 
1  157  IN  Telangana  Hyderabad 
2  346  IN  Maharashtra Pune(Bund Garden) 
. 
. 
. 

基本上要到t根據該觀察結果No落入在範圍(Start NoEnd No)在codes 2 AG Nocodes1

另外的順序可以是在codes 2 DF任何東西。

+0

你已經試過了什麼?你能提供一個可重複的例子嗎? –

+0

表'碼1'只有這個尺寸還是更大?你可以做一個'if'語句來關聯'codes2'的每個元素。 –

+0

@PierreChevallier這兩個表的大小都比這裏顯示的大。 –

回答

3

如果你舒適的編寫SQL,您可以考慮使用sqldf包做這樣的事情

library('sqldf') 
result <- sqldf('select * from codes2 left join codes1 on codes2.No between codes1.StartNo and codes1.EndNo') 

您可能必須從刪除特殊字符和空格預先提供數據框的列名。

+0

這很容易,謝謝隊友 –

+0

但有一點,它應該返回與codes2相同的行數,我認爲這有一個問題。 –

+1

對,在這種情況下,我們應該做一個左連接而不是內連接。 (只需用代碼中的'left join'替換'join')。 – WHoekstra

6

你可以使用非等距加入data.table包的能力爲:

library(data.table) 
setDT(codes1) 
setDT(codes2) 

codes2[codes1, on = .(No > StartNo, No < EndNo),   ## (1) 
     `:=`(cntry = Country, state = State, city = City)] ## (2) 

(1)獲得在codes2匹配對應於各行中codes1行索引,而在提供給條件匹配參數on

(2)更新codes2值用於通過參考直接指定的列的那些匹配行(即,不必將結果分配回另一變量)。

這給:

codes2 
# ID No cntry  state    city 
# 1: 1 157  IN Telangana   Hyderabad 
# 2: 2 346  IN Maharashtra Pune (Bund Garden) 
# 3: 3 389  IN Maharashtra Pune (Bund Garden) 
# 4: 4 453  NA   NA     NA 
# 5: 5 562  IN  Haryana   Gurgaon 
# 6: 6 9874  NA   NA     NA 
# 7: 7 98745  NA   NA     NA