Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据ip范围在R中排序ip地址_R_Loops_Sorting - Fatal编程技术网

根据ip范围在R中排序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行数依此类推,直

我目前在整理一个特定的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行数依此类推,直到到达大约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: