sql >> Base de Datos >  >> RDS >> Mysql

Convierta la dirección IP (IPv4) si no es un número entero en R

No fue completamente específico acerca de qué conversión quería, así que multipliqué los valores decimales por lo que pensé que podría ser apropiado (pensando que los elementos de tres dígitos eran en realidad equivalentes de dígitos en números de "base 256" y luego se volvieron a mostrar en base 10). Si quisiera invertir el orden de las ubicaciones, como he visto sugerido en otra parte, invertiría la indexación de 'vals' en ambas soluciones

 convIP <- function(IP) { vals <- read.table(text=as.character(IP), sep=".")
               return( vals[1] + 256*vals[2] + 256^2*vals[3] + 256^3*vals[4]) }

> convIP(dat$IP)
          V1
1 2476281533
2  134990147
3 2352289344
4  173345204
5 2122844258
6 1153107520

(Por lo general, es una mejor práctica de TI especificar cuál cree que es la respuesta correcta para que se puedan realizar las pruebas. El comentario anterior de Bertelson sería más rápido e implícitamente usa 1000, 1000^2 y 1000^3 como factores).

Estoy tratando de simplificar el código, pero temo que la necesidad de usar Reduce("+", ...) puede hacerlo más complejo. No puede usar sum porque no está vectorizado.

 convIP <- function(IP) { vals <- read.table(text=as.character(IP), sep=".")
                return( Reduce("+", vals*256^(3:0))) }

> convIP(dat$IP)
[1] 5737849088    5112017 2717938944    1245449 3925902848   16449610