根据ip范围在R中排序ip地址
我目前在整理一个特定的ip地址到一个a-B的ip范围时结结巴巴的 比如说根据ip范围在R中排序ip地址,r,loops,sorting,R,Loops,Sorting,我目前在整理一个特定的ip地址到一个a-B的ip范围时结结巴巴的 比如说 Col A Col B Col C 1 10.0.0.0 10.0.0.255 1.5.2.1 2 10.0.1.0 10.0.3.255 60.5.1.30 3 10.0.4.0 10.0.4.255 10.0.0.233 . . . 605 60.5.1.0 60.5.1.255 10.0.2.254 . . A列和B列中的X行数依此类推,直
Col A Col B Col C
1 10.0.0.0 10.0.0.255 1.5.2.1
2 10.0.1.0 10.0.3.255 60.5.1.30
3 10.0.4.0 10.0.4.255 10.0.0.233
.
.
.
605 60.5.1.0 60.5.1.255 10.0.2.254
.
.
A列和B列中的X行数依此类推,直到到达大约1mil行的网络地址末尾~
列A和B实际上是ip起始范围和ip结束范围,而我的目的是对其进行分类,例如,列C 10.0.0.233应该属于第1行而不是第3行
是否有任何方法可以对C列中的所有不同ip地址进行排序,使其属于A列和B列
谢谢:
编辑:我正在使用数据表,如果可能的话。干杯
Edit2:我需要使第2行的col c与第605行的col c相匹配,而第605行的col c与第2行的col c相匹配,等等。我不知道这是否是您正在寻找的功能,但我们的想法是将col和col c与第3点之前的数字匹配 如果是这样的话,我想这可能会奏效
df <- data.frame(ColA=c("10.0.0.0","10.0.1.0","10.0.4.0"),
ColB=c("10.0.0.255","10.0.3.255","10.0.4.255"),
ColC=c("1.5.2.1","60.5.1.30","10.0.0.233"))
require(dplyr)
DF1 <- df %>% select(1,2) %>% mutate(ColMatch=substr(start = 1,stop = as.numeric(regexpr(".([^.]*)$",df$ColA))-1,ColA))
DF2 <- df %>% select(3) %>% mutate(ColMatch=substr(start = 1,stop = as.numeric(regexpr(".([^.]*)$",df$ColC))-1,ColC))
DF <- left_join(DF1,DF2) %>% select(-ColMatch)
head(DF)
ColA ColB ColC
1 10.0.0.0 10.0.0.255 10.0.0.233
2 10.0.1.0 10.0.3.255 <NA>
3 10.0.4.0 10.0.4.255 <NA>
下面的尝试使用滚动右联接,即它尝试为C列中的所有值查找匹配的IP范围[a列,B列]。不删除列C值,但删除列C中没有匹配值的IP范围 包iptools用于将IP地址从人类可读的表示转换为数字表示
library(data.table)
# Development version 1.9.7
ip <- fread( "id Col_A Col_B Col_C
1 10.0.0.0 10.0.0.255 1.5.2.1
2 10.0.1.0 10.0.3.255 60.5.1.30
3 10.0.4.0 10.0.4.255 10.0.0.233
605 60.5.1.0 60.5.1.255 10.0.2.254
")
# convert strings to integers: an ip address actually is a 32 bit number
ip_cols <- paste0("Col_", LETTERS[1:3])
num_cols <- paste0("num_", LETTERS[1:3])
ip[, (num_cols) := lapply(.SD, iptools::ip_to_numeric), .SD = ip_cols]
# add column to join on (for clarity)
ip[, num_join := num_A]
# right join
result <- ip[ip[, .(Col_C, num_C)], on = .(num_join = num_C), roll = TRUE][order(id)]
# check upper bound - in case there are gaps in the IP ranges
result[num_join > num_B, c(ip_cols, num_cols) := NA][]
id Col_A Col_B Col_C num_A num_B num_C num_join i.Col_C
1: 1 10.0.0.0 10.0.0.255 1.5.2.1 167772160 167772415 17105409 167772393 10.0.0.233
2: 2 10.0.1.0 10.0.3.255 60.5.1.30 167772416 167773183 1006960926 167772926 10.0.2.254
3: 605 60.5.1.0 60.5.1.255 10.0.2.254 1006960896 1006961151 167772926 1006960926 60.5.1.30
4: NA NA NA NA NA NA NA 17105409 1.5.2.1
我能够复制您的data.table,但对于将来的问题,请根据R标记说明使用dput,以使复制数据更容易。干杯。嗨@Hack-R你所说的重新导入数据表是什么意思?IP范围[Col_A,Col_B]中有重叠吗?当没有IP范围Col_C配合时会发生什么?是否应该删除该值?Hi@UweBlock否,a列和B列的IP范围中没有一个重叠。如果C列没有适合C列的IP范围,则C列应返回NA。Hi@Eduardo_Clark是否可以限制为适合每个IP范围,而不是第四个八位字节?所以我对IP范围不太了解,所以你是说可乐和可乐是间歇期?你想设计一个符合这个时间间隔的ColC吗?如果是,范围如何工作,10.0.1.0是10.0.0.255之后的下一个ip吗?是@Eduardo_Clark: