2014-02-06 58 views
2

我正在寻找一种方法来编写R中的函数,它将IP地址转换为整数。转换IP地址(IPv4)itno一个整数在R

我的数据框看起来是这样的:

total IP 
626 189.14.153.147 
510 67.201.11.8 
509 64.22.53.140 
483 180.9.85.10 
403 98.8.136.126 
391 64.06.187.68 

我从MySQL数据库中导出这些数据。我有一个查询在那里我可以一个IP地址转换成整数的mysql:

mysql> select CAST(SUBSTRING_INDEX(SUBSTRING_INDEX('75.19.168.155', '.', 1), '.', -1) << 24 AS UNSIGNED) + CAST(SUBSTRING_INDEX(SUBSTRING_INDEX('75.19.168.155', '.', 2), '.', -1) << 16 AS UNSIGNED) + CAST(SUBSTRING_INDEX(SUBSTRING_INDEX('75.19.168.155', '.', 3), '.', -1) << 8 AS UNSIGNED) + CAST(SUBSTRING_INDEX(SUBSTRING_INDEX('75.19.168.155', '.', 4), '.', -1) AS UNSIGNED) FINAL; 

但我想这样做在读该转换,任何帮助将是真棒

+0

为什么不使用['INET6_ATON()'](http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton)/ ['INET_ATON( )'](http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet-aton),然后只是原始整数? – BlitZ

+0

'gsub(“。”,“”,df $ IP)' –

回答

3

你不是完全具体什么你需要的转换,所以我乘以我认为可能适当的(我认为三位数字的项目实际上是数字等值“基地256”数字,然后重新显示在基10)小数值。如果你想要的位置的顺序被颠倒过来,因为我已经在其他地方看到的建议,你会扭转“丘壑”的索引中的这两个解决方案

convIP <- function(IP) { vals <- read.table(text=as.character(IP), sep=".") 
       return(vals[1] + 256*vals[2] + 256^2*vals[3] + 256^3*vals[4]) } 

> convIP(dat$IP) 
      V1 
1 2476281533 
2 134990147 
3 2352289344 
4 173345204 
5 2122844258 
6 1153107520 

(它通常是更好的IT实践来指定哪些你认为是是正确答案,因此可以进行测试,Bertelson上面的评论会更快,并且隐含地使用1000,1000^2和1000^3作为因子)。需要使用Reduce("+", ...)可能会使它更复杂。您不能使用sum,因为它没有被矢量化。

convIP <- function(IP) { vals <- read.table(text=as.character(IP), sep=".") 
       return(Reduce("+", vals*256^(3:0))) } 

> convIP(dat$IP) 
[1] 5737849088 5112017 2717938944 1245449 3925902848 16449610 
+1

非常感谢,这正是我想要的,我为不清楚而感到遗憾。基本上这是我的主要目标convIP < - function(IP){vals < - read.table(text = as.character(IP),sep =“。”) + return(256^3 * vals [1] + 256^2 * vals [2] + 256 * vals [3] + vals [4])} – user3006691

+0

Ooops。我想我颠倒了乘法的顺序。 –

+0

但我不明白Bertelsen的命令会如何工作? @IShouldBuyABoat – user3006691