En R, tengo una operación que crea algunos Inf
valores cuando transformo un marco de datos.
Me gustaría convertir estos Inf
valores en NA
valores. El código que tengo es lento para datos grandes, ¿hay alguna forma más rápida de hacer esto?
Digamos que tengo el siguiente marco de datos:
dat <- data.frame(a=c(1, Inf), b=c(Inf, 3), d=c("a","b"))
Lo siguiente funciona en un solo caso:
dat[,1][is.infinite(dat[,1])] = NA
Así que lo generalicé con el siguiente bucle.
cf_DFinf2NA <- function(x)
{
for (i in 1:ncol(x)){
x[,i][is.infinite(x[,i])] = NA
}
return(x)
}
Pero no creo que esto realmente esté usando el poder de R.
r
dataframe
data.table
ricardo
fuente
fuente
Utilice
sapply
yis.na<-
O puede usar (dando crédito a @mnel, cuya edición es esta),
que es significativamente más rápido.
fuente
is.na<-
no aceptaría un resultado de,lapply
pero sí lo aceptaríasapply
.is.na<-
solución es mucho más lenta.[<-
conmapply
es un poco más rápido quesapply
.Con los datos de mnel, el tiempo es
fuente
Aquí hay una solución dplyr / tidyverse usando la función na_if () :
Tenga en cuenta que esto solo reemplaza el infinito positivo con NA. Es necesario repetirlo si también es necesario reemplazar los valores infinitos negativos.
fuente
Hay una solución muy simple a este problema en el paquete hablar:
Los que devuelven un marco de datos con todos los Inf se convierten a NA.
Tiempos comparados con algunas soluciones anteriores. Código: biblioteca (hablar) biblioteca (data.table)
Resultado:
Parece que data.table es más rápido que hablar. Pero tiene una sintaxis más larga.
fuente
Feng Mai tiene una respuesta tidyverse arriba para obtener infinitos negativos y positivos:
Esto funciona bien, pero una advertencia es no intercambiar abs (.) Aquí para hacer ambas líneas a la vez como se propone en un comentario votado a favor. Parecerá que funciona, pero cambia todos los valores negativos en el conjunto de datos a positivos. Puedes confirmar con esto:
Para una línea, esto funciona:
fuente
Otra solución:
fuente
También puede utilizar la práctica función replace_na: https://tidyr.tidyverse.org/reference/replace_na.html
fuente