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).
3 Réponses :
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
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
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