2016-10-11 2 views
-1

에 R베이스에 IP 주소를 정렬 나는의 IP 범위에 특정 IP 주소를 분류에서 현재 stucked입니다. 그래서 계속해서 COL A 및 B에서 행 X의 양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 (1mil 행 ~ 정도) 네트워크 어드레스의 끝에 도달 B 실제로 IP 개시 범위까지 그리고 끝내는 범위 내 의도는 예를 들어, Col C 10.0.0.233 행 3 대신 행 1에 속해 있어야합니다.

모든 다른 IP 주소를 정렬 할 수있는 방법이 있나요 C는 col A와 B의 행에 속합니다.

감사합니다 :)

편집 : 그것은 중요 할 수 있다면이 데이터 테이블을 사용하고 있습니다. 건배. Edit2 : 행 2 열에서 col c를 행 605에 맞출 필요가 있습니다. 행 605 Col C는 행 2 등으로 갈 것입니다.

+0

나는 당신의 data.table을 재현 할 수 있었지만, 미래의 질문을하기 위해 R 태그 설명에 따라'dput()'을 사용하여 데이터를 쉽게 재생산하도록하십시오. 건배. –

+0

안녕하세요 @ 해킹 - R 당신은 데이터 테이블을 repoducing 뜻이야? – user127886

+0

IP 범위'[Col_A, Col_B]'에 겹침이 있습니까? 'Col_C'의 IP 범위가 없을 때 어떻게 될까요? 해당 값을 삭제해야합니까? – Uwe

답변

0

이것이 당신이 찾고있는 기능인지는 모르겠습니다. 그러나이 아이디어는 ColA와 ColC를 3 포인트 (.) 앞에있는 숫자와 일치시키는 아이디어와 일치시킵니다. 그렇다면

내가 즉이 Col_C 일치하는 IP 범위 [Col_A, Col_B]모든 값을 찾습니다, 다음 시도가 잘 결합 압연에 사용이 트릭

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> 
+0

안녕하세요 @Eduardo_Clark는 네 번째 옥텟 대신 IP 범위 각각에 맞도록 제한 할 수 있습니까? 건배 – user127886

+0

좋아, IP 범위에 대해 많이 알지 못해서 ColA와 ColB가 간격이라고 나에게 말하고있는 것입니까? 그리고 그 간격에 맞는 ColC를 배치하고 싶습니까? 그렇다면 범위 작동 방식은 10.0.1.0 10.0.0.255 이후의 다음 ip입니까? – eclark

+0

예 @Eduardo_Clark :) – user127886

1

을 할 것 같아요. Col_C 값은 삭제되지만 일치 값이없는 IP 범위는 Col_C에서 삭제됩니다.

패키지 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