2017-04-03 96 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