2016-10-09 36 views
0

比方说,我等等等在列A(2500行数据),所有这些都是十进制的,我会想下面转换列数据十进制转换为IP地址中的R

Col A 

16777216 
16812288 
16813568 
16785408 

使用R中的库包进行转换,iptools通过使用iptools :: numeric_to_ip函数对其每个行数据进行转换并替换它们,我如何动态地执行循环所有的值并替换它,而不用硬编码值?

此外,我有另一个栏目,说明IP的最终值,我想知道如何找到如何找到国家(又一列C),当一个特定的IP地址落入此范围内开始IP和结束IP地址,但我想我会把它留给另一个问题。

感激,如果你们可以在此提供一些线索,真正的新R.

干杯, TechNewbie。

回答

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)] 
+0

'numeric_to_ip'等不是'data.table'操作。你使用了什么软件包? –

+0

@MatthewLundberg我用'iptools'。提出问题的用户在说明中提到了该软件包。 –

+0

@JaimeCaffarel嗨,有没有办法在数据框架内动态加载列值,而不必像你做的那样静态地输入它,因为我的数据是动态的而不是静态的 - 它会改变。 – Newbie