我一直在寻找一种在R中编写函数的方法,它将IP地址转换为整数。
我的数据框如下所示:
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;
但是我想在R中进行这种转换,任何帮助都会很棒
答案 0 :(得分:3)
你并不完全具体说明你想要什么样的转换,所以我将十进制值乘以我认为合适的值(认为三位数项实际上是数字等价的“256”基数,然后在基数10中重新显示)。如果您希望颠倒位置的顺序,正如我在其他地方所建议的那样,您将反转两个解决方案中“vals”的索引
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