1
votes

Donnez-moi les utilisateurs en recherchant et en filtrant l'adresse IP de 4 ° octets

Une adresse IP se compose de quatre nombres décimaux, chacun compris entre 0 et 255, séparés par des points. J'ai besoin de trouver un script dans R qui recherche les utilisateurs dont l'adresse IP du dernier octet est supérieure ou égale à 128. Disons que j'ai les données suivantes:

User   IP_Address
Carl   172.16.2.129
Mary   192.16.15.254
Jessie 192.168.25.200

Le résultat devrait me donner les utilisateurs / ips:

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') )

Parce que tous les derniers octets de ces ip sont supérieurs ou égaux à 128 (129, 254 et 200).

r

0 commentaires

3 Réponses :


1
votes

En utilisant la base R, nous pouvons tout extraire après le dernier point, convertir en entier, comparer et sous-ensemble

library(stringr)
IP_LIST[as.integer(word(IP_LIST$IP, -1, sep = "\\.")) > 128, ]

En utilisant la même logique, nous pourrions avoir quelques options supplémentaires en utilisant différentes bibliothèques.

stringi :: stri_extract_last_regex extrait le dernier motif. Nous pourrions extraire le dernier numéro en l'utilisant et suivre le même processus.

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

Sans nous impliquer dans l'expression régulière, nous pourrions utiliser la fonction word de stringr pour obtenir le dernier mot avec l'arateur sep comme point (. )

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


0 commentaires

0
votes

une autre approche tidyverse

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

mais data.table est un peu plus rapide ...

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

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


0 commentaires

0
votes

Nous pouvons utiliser base R avec sous-ensemble et 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 commentaires