Дайте мне пользователей путем поиска и фильтрации для 4-го октетного IP-адреса - PullRequest
0 голосов
/ 28 января 2019

IP-адрес состоит из четырех десятичных чисел, каждое в диапазоне от 0 до 255, разделенных точками.Мне нужно найти скрипт в R, который ищет пользователей, у которых IP-адрес последнего октета больше или равен 128. Допустим, у меня есть следующие данные:

library(iptools)
library(dplyr)
library(stringr)
library(tidyr)

IP_LIST <- data.frame(
  "User" = c("John", "Carl", "Mary", 
             "Kim", "Jane", "Jessie",
             "Peter"),
  "IP" = c('172.16.0.15',
  '192.168.200.90',
  '172.16.2.129',
  '198.16.15.254',
  '172.25.25.19',
  '192.168.25.200',
  '192.129.200.10') )

Результат должен дать мне пользователей/ ips:

User   IP_Address
Carl   172.16.2.129
Mary   192.16.15.254
Jessie 192.168.25.200

Поскольку последние октеты всех этих ip больше или равны 128 (129, 254 и 200).

Ответы [ 3 ]

0 голосов
/ 28 января 2019

другой tidyverse подход

library( tidyverse )
IP_LIST %>% filter( str_extract( IP, "[0-9]+$" ) %>% as.numeric() >= 128 )

#     User             IP
# 1   Mary   172.16.2.129
# 2    Kim  198.16.15.254
# 3 Jessie 192.168.25.200

, но data.table немного быстрее ...

library( data.table )
library( tidyverse )
setDT( IP_LIST )[str_extract( IP, "[0-9]+$" ) %>% as.numeric() >= 128, ] )

#      User             IP
# 1:   Mary   172.16.2.129
# 2:    Kim  198.16.15.254
# 3: Jessie 192.168.25.200

тест

microbenchmark::microbenchmark(
  tidyverse = IP_LIST %>% filter( str_extract( IP, "[0-9]+$" ) %>% as.numeric() >= 128 ),
  data.table = setDT( IP_LIST )[str_extract( IP, "[0-9]+$" ) %>% as.numeric() >= 128, ] )

# Unit: microseconds
#       expr     min       lq     mean   median       uq      max neval
#  tidyverse 726.348 764.3070 827.6146 782.9855 859.3555 1427.389   100
# data.table 510.643 588.3685 673.1204 657.6590 706.4640 1826.865   100
0 голосов
/ 28 января 2019

Мы можем использовать base R с subset и sub

subset(IP_LIST, as.numeric(sub(".*\\.", "", IP)) > 128)
#    User             IP
#3   Mary   172.16.2.129
#4    Kim  198.16.15.254
#6 Jessie 192.168.25.200
0 голосов
/ 28 января 2019

Используя базу R, мы можем извлечь все после последней точки, преобразовать в целое число, сравнить и задать подмножество

IP_LIST[as.integer(sub(".*\\.(\\d+)", "\\1", IP_LIST$IP)) > 128, ]

#    User             IP
#3   Mary   172.16.2.129
#4    Kim  198.16.15.254
#6 Jessie 192.168.25.200

Используя ту же логику, мы могли бы иметь несколько дополнительных опций, используя разные библиотеки.

stringi::stri_extract_last_regex извлекает последний шаблон.Мы могли бы извлечь последнее число, используя его, и затем выполнить тот же процесс.

library(stringi)
IP_LIST[as.integer(stri_extract_last_regex(IP_LIST$IP, "\\d+")) > 128, ]

Не вмешиваясь в регулярное выражение, мы могли бы использовать функцию word из stringr, чтобы получить последнее слово с sep aratorкак точка (.)

library(stringr)
IP_LIST[as.integer(word(IP_LIST$IP, -1, sep = "\\.")) > 128, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...