Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R data.table条件搜索_R_Dataframe_Data.table - Fatal编程技术网

R data.table条件搜索

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] } 在

如何按条件在data.table中搜索

我有一个表,比如说,包含用户ip的用户,一个ip范围从。我想为每个用户获得一个国家/地区。问题是,为了找到一个国家,您需要将IP拆分为令牌,并应用一些公式来获得表示地址的整数值。然后,您需要找到该值在范围内的行

我设法用数据做到了这一点。帧的,但它是非常缓慢的

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"]