【问题标题】:Converting column data decimal into ip address in R将列数据十进制转换为R中的IP地址
【发布时间】:2017-02-18 04:39:11
【问题描述】:

假设我有以下内容

 Col A

16777216 
16812288 
16813568
16785408

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

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

感谢你们能对此有所了解,对 R 来说真的很陌生。

干杯, 技术新手。

【问题讨论】:

    标签: r loops csv iptools


    【解决方案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)]
    

    【讨论】:

    • numeric_to_ip 等不是data.table 操作。你用的是什么包?
    • @MatthewLundberg 我使用了iptools。提出问题的用户在描述中提到了该包。
    • @JaimeCaffarel 嗨,有没有办法在数据框中动态加载列值,而不必像你所做的那样静态地输入它,因为我的数据是动态的而不是静态的 - 它会改变。
    • @JaimeCaffarel 嗨!没关系,我想通了,非常感谢您的回答和备忘单!它真的很有帮助。干杯 ;)
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2016-07-05
    • 2023-03-05
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多