假设你有一个数据表与您的数据:
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)]
'numeric_to_ip'等不是'data.table'操作。你使用了什么软件包? –
@MatthewLundberg我用'iptools'。提出问题的用户在说明中提到了该软件包。 –
@JaimeCaffarel嗨,有没有办法在数据框架内动态加载列值,而不必像你做的那样静态地输入它,因为我的数据是动态的而不是静态的 - 它会改变。 – Newbie