将列数据十进制转换为R

时间:2016-10-09 17:56:54

标签: r loops csv

我们说我有以下

 Col A

16777216 
16812288 
16813568
16785408

等等,对于A列(2500行数据),所有这些都是十进制值,我想用R,iptools中的库包转换它们,每个行使用iptools :: numeric_to_ip函数数据并替换它们,我如何动态地循环遍历所有值并替换它而不用硬编码值?

此外,我还有另一列说明了IP的最终价值,我想知道如何在特定的IP地址落入这个启动范围时找到如何找到国家(还有另一列C) IP和结束IP地址,但我想我会把它留给另一个问题。

赞赏你们是否可以对此有所了解,对R来说真的很新。

干杯, TechNewbie。

1 个答案:

答案 0 :(得分:1)

假设您有一个包含数据的数据表:

library(data.table)
library(iptools)
test <- data.table(V1 = c(16777216, 16812288, 16813568, 16785408), 
V2 = c("A", "B", "C", "D"), 
V3 = c("122.0.0.0", "1.0.1.0", "172.16.0.1", "192.168.1.1"))

         V1 V2          V3
1: 16777216  A   122.0.0.0
2: 16812288  B     1.0.1.0
3: 16813568  C  172.16.0.1
4: 16785408  D 192.168.1.1

为了将每个值转换为有效的IP,您可以使用以下简单语法:

test[, V1 := numeric_to_ip(V1)]

          V1 V2          V3
1:   1.0.0.0  A   122.0.0.0
2: 1.0.137.0  B     1.0.1.0
3: 1.0.142.0  C  172.16.0.1
4:  1.0.32.0  D 192.168.1.1

此结构的作用是遍历列的每一行(V1)并修改从numeric_to_ip()调用返回的值。 Here是您可以对数据表执行的操作量的一个很好的总结。

当然,您也可以使用相同的方法来检测特定范围内的IP:

test[, V4 := ip_in_range(V1, "1.0.0.0/24")]

          V1 V2          V3    V4
1:   1.0.0.0  A   122.0.0.0  TRUE
2: 1.0.137.0  B     1.0.1.0 FALSE
3: 1.0.142.0  C  172.16.0.1 FALSE
4:  1.0.32.0  D 192.168.1.1 FALSE

或者比较一行中的两个IP是否在同一范围内(使用iptools库):

test[, V4 := ifelse(ip_in_range(V1, V3), TRUE, FALSE)]

          V1 V2          V3    V4
1:   1.0.0.0  A   122.0.0.0 FALSE
2: 1.0.137.0  B     1.0.1.0 FALSE
3: 1.0.142.0  C  172.16.0.1 FALSE
4:  1.0.32.0  D 192.168.1.1 FALSE

或者可以定义自己的功能并根据其他标准比较值:

compareTwoIPs <- function(ip1, ip2){
   # do whatever you want
}

test[, Result := compareTwoIPs(V1, V3)]