我正在寻找一种在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中进行此转换,任何帮助都很棒
您对想要的转换并不完全具体,因此我将小数值乘以我认为可能适当的(认为三位数项目实际上是"基础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
(通常是更好地指定您认为是正确答案的方法,因此可以进行测试。上面的贝尔特森评论将更快,隐含地使用1000、1000^2和1000^3作为因素。)p>我在简化代码时会破解,但担心使用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