data.table条件搜索

时间:2014-06-20 11:04:01

标签: r dataframe data.table

如何按条件搜索data.table?

我有一个表,比方说,用户包含用户ip +来自http://dev.maxmind.com/geoip/legacy/csv/的ip范围表。我想为每个用户建立一个国家/地区。问题是,为了找到一个国家/地区,您需要将IP拆分为令牌并应用一些公式来获取表示地址的整数值。然后,您需要找到该值适合范围的行。

我设法用data.frame做了,但它很慢..

extract.country <- function(code) {
  geo[(geo['V3']<=code & code<=geo['V4'])][6]
}

有93100个IP地址范围和相对相同数量的用户。但它似乎需要采取

   user  system elapsed 
   17.109   1.144  20.649 

在我的机器上处理100个用户。这将是大约5个小时来处理所有这些。

这就是我的&amp; geoIP数据集如下所示:

> head(dat)
                   V2            V26
1 2014-03-01 14:06:59  86.183.184.19
2 2014-03-01 23:50:02  86.112.53.139
3 2014-03-01 15:07:02    5.69.149.65
4 2014-03-01 14:27:18 218.186.19.230
5 2014-03-01 13:08:31   86.0.151.153
6 2014-03-01 23:18:00    79.148.42.6
> 
> head(geo)
        V1         V2       V3       V4 V5        V6
1  1.0.0.0  1.0.0.255 16777216 16777471 AU Australia
2  1.0.1.0  1.0.3.255 16777472 16778239 CN     China
3  1.0.4.0  1.0.7.255 16778240 16779263 AU Australia
4  1.0.8.0 1.0.15.255 16779264 16781311 CN     China
5 1.0.16.0 1.0.31.255 16781312 16785407 JP     Japan
6 1.0.32.0 1.0.63.255 16785408 16793599 CN     China

每个IP的位置我计算一个int值,比如

[1] 1454880787 1450194315   88446273 3669627878 1442879385 1335110150

我想用data.table改进性能,因为列可能会被索引,性能对于精确搜索非常有用。但我无法弄清楚如何使用它进行条件搜索。

或者,还有其他方法可以用R吗?

2 个答案:

答案 0 :(得分:1)

这应该是你要找的东西:

dt<-data.table(num=c(1,2,3,1,3,4,6,7,7,7,8,3), let=(rep(c("A","B","C"), each=4)))

然后:

dt[num > 1 & let == "B"]

答案 1 :(得分:0)

我是R的新手,所以可能是错的。似乎行按V3列中的值排序(如果不是 - 对它们进行排序),因此您可以使用快速二进制搜索。

extract.country <- function(code) {
    geo[[findInterval(code,geo$V3),"V6"]]
}