我们说我有以下
Col A
16777216
16812288
16813568
16785408
等等,对于A列(2500行数据),所有这些都是十进制值,我想用R,iptools中的库包转换它们,每个行使用iptools :: numeric_to_ip函数数据并替换它们,我如何动态地循环遍历所有值并替换它而不用硬编码值?
此外,我还有另一列说明了IP的最终价值,我想知道如何在特定的IP地址落入这个启动范围时找到如何找到国家(还有另一列C) IP和结束IP地址,但我想我会把它留给另一个问题。
赞赏你们是否可以对此有所了解,对R来说真的很新。
干杯, TechNewbie。
答案 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)]