如何按条件搜索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吗?
答案 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"]]
}