开始于:
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
基本上,从IP
到IP1
生成IP2
的列表。它不必位于相同的数据框中,但为了简洁起见,此处以这种方式显示。
答案 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=".")
}