我有两张桌子。表A包含' ip_address'字段和其他表格B包含' ip_start'和' ip_end' (ip的范围)以及其他字段。我想从表B中提取ip_address的详细信息。
例如。表A有
ip_address : '178.91.21.2"
表B
1. ip_start : "178.91.19.0" and ip_end : "178.91.19.255"
2. ip_start : "178.91.21.0" and ip_end : "178.91.21.255"
现在我的查询应该返回表B中与记录2相关的详细信息。
我想在R中实现这一点。任何人都可以建议如何做到这一点?
答案 0 :(得分:4)
这是一种方式。您指定的ipv4地址基本上是8字节十六进制的十进制表示,因此只需通过如下转换即可将它们表示为十进制整数。
a.b.c.d = a×256 3 + b×256 2 + c×256 + d
因此我们对测试向量(本例中为ip
)和范围数据帧(本例中为ip.range
)执行此操作,然后使用简单算法确定哪个范围与哪个ip匹配
# example dataset
ip <- c("178.91.21.2","178.91.19.30","178.91.20.100")
ip.range <- data.frame(start=c("178.91.19.0", "178.91.20.0", "178.91.21.0"),
end= c("178.91.19.255","178.91.20.255","178.91.21.255"),
stringsAsFactors=FALSE)
# function to convert ip address to decimal integer
ip2integer <- function(ip) sapply(strsplit(ip,".",fixed=TRUE),function(x)sum(as.integer(x)*256^(3:0)))
# convert ip and ranges to integer
ip.int <- ip2integer(ip)
range.int <- data.frame(sapply(ip.range,ip2integer))
# find indices, combine into result
indx <- sapply(ip.int,function(x)with(range.int,which(x>=start & x <=end)))
result <- cbind(ip,ip.range[indx,])
result
# ip start end
# 3 178.91.21.2 178.91.21.0 178.91.21.255
# 1 178.91.19.30 178.91.19.0 178.91.19.255
# 2 178.91.20.100 178.91.20.0 178.91.20.255