R data.table条件搜索
如何按条件在data.table中搜索 我有一个表,比如说,包含用户ip的用户,一个ip范围从。我想为每个用户获得一个国家/地区。问题是,为了找到一个国家,您需要将IP拆分为令牌,并应用一些公式来获得表示地址的整数值。然后,您需要找到该值在范围内的行 我设法用数据做到了这一点。帧的,但它是非常缓慢的R data.table条件搜索,r,dataframe,data.table,R,Dataframe,Data.table,如何按条件在data.table中搜索 我有一个表,比如说,包含用户ip的用户,一个ip范围从。我想为每个用户获得一个国家/地区。问题是,为了找到一个国家,您需要将IP拆分为令牌,并应用一些公式来获得表示地址的整数值。然后,您需要找到该值在范围内的行 我设法用数据做到了这一点。帧的,但它是非常缓慢的 extract.country <- function(code) { geo[(geo['V3']<=code & code<=geo['V4'])][6] } 在
extract.country <- function(code) {
geo[(geo['V3']<=code & code<=geo['V4'])][6]
}
在我的机器上处理100个用户。大约需要5个小时来处理所有这些
这就是my&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做到这一点?我是R新手,所以可能是错的。行似乎是按V3列中的值排序的(如果不是,则对它们进行排序),所以您可以使用快速二进制搜索。
extract.country <- function(code) {
geo[[findInterval(code,geo$V3),"V6"]]
}
extract.country这应该是您要找的:
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)))
它的可读性不超过15分钟,并提供了一个良好的开端:@ColonelBeauvel谢谢。我读过。不幸的是,没有关于条件搜索的信息。大多数例子都是像DT[J(“R”,“h”)
这样的搜索,它等于DF[DF$x==“R”&DF$y==“h”]
geo[V3@eddi谢谢,这对我很有用!谢谢!这正是我要找的。
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"]