R生成IP编号序列

时间:2018-08-23 18:59:48

标签: r

开始于:

   OrigID  IP1              IP2
        1  111.111.111.250  111.111.112.005

所需的输出:

   OrigId  IP1              IP2              IP
        1  111.111.111.250  111.111.112.005  111.111.111.250
        1  111.111.111.250  111.111.112.005  111.111.111.251
        1  111.111.111.250  111.111.112.005  111.111.111.252
        1  111.111.111.250  111.111.112.005  111.111.111.253
        1  111.111.111.250  111.111.112.005  111.111.111.254
        1  111.111.111.250  111.111.112.005  111.111.111.255
        1  111.111.111.250  111.111.112.005  111.111.112.001
        1  111.111.111.250  111.111.112.005  111.111.112.002
        1  111.111.111.250  111.111.112.005  111.111.112.003
        1  111.111.111.250  111.111.112.005  111.111.112.004
        1  111.111.111.250  111.111.112.005  111.111.112.005

基本上,从IPIP1生成IP2的列表。它不必位于相同的数据框中,但为了简洁起见,此处以这种方式显示。

1 个答案:

答案 0 :(得分:2)

iptools库可以在这里提供帮助。例如输入数据

dd <- read.table(text=" OrigID  IP1              IP2
1  111.111.111.250  111.111.113.005", header=T, stringsAsFactors=FALSE)

我们可以编写一个辅助函数

library(iptools)
ip_range <- function(start, end) {
  numeric_to_ip(ip_to_numeric(start):ip_to_numeric(end))
}

然后可以使用它来扩展行,这里使用dplyr

library(dplyr)    
dd %>% rowwise() %>% do({data.frame(., IP=ip_range(.$IP1, .$IP2))})

获得

   OrigID IP1             IP2             IP             
 *  <int> <fct>           <fct>           <fct>          
 1      1 111.111.111.250 111.111.113.005 111.111.111.250
 2      1 111.111.111.250 111.111.113.005 111.111.111.251
 3      1 111.111.111.250 111.111.113.005 111.111.111.252
 4      1 111.111.111.250 111.111.113.005 111.111.111.253
 5      1 111.111.111.250 111.111.113.005 111.111.111.254
 6      1 111.111.111.250 111.111.113.005 111.111.111.255
 7      1 111.111.111.250 111.111.113.005 111.111.112.0  
 8      1 111.111.111.250 111.111.113.005 111.111.112.1  
 9      1 111.111.111.250 111.111.113.005 111.111.112.2  
10      1 111.111.111.250 111.111.113.005 111.111.112.3  
# ... with 258 more rows

如果您真的想使用前导零进行格式化,则可以编写格式化程序。例如在基数R

format_ip <- function(x) {
  sapply(lapply(lapply(strsplit(x, ".", fixed=TRUE), as.numeric), function(x) sprintf("%03d", x)), paste0, collapse=".")
}

或使用purrr更具可读性

library(purrr)
format_ip <- function(x) {
  x %>% strsplit(".", fixed=TRUE) %>% 
    map(~sprintf("%03d", as.numeric(.))) %>% 
    map_chr(paste0, collapse=".")
}