R Language
Valores faltantes
Buscar..
Introducción
Cuando no sabemos el valor que toma una variable, decimos que falta su valor, indicado por NA .
Observaciones
Los valores que faltan están representados por el símbolo NA (no disponible). Los valores imposibles (p. Ej., Como resultado de sqrt(-1) ) están representados por el símbolo NaN (no es un número).
Examinando los datos faltantes
anyNA informa si hay algún valor faltante presente; mientras is.na informa valores perdidos elementwise:
vec <- c(1, 2, 3, NA, 5)
anyNA(vec)
# [1] TRUE
is.na(vec)
# [1] FALSE FALSE FALSE TRUE FALSE
ìs.na devuelve un vector lógico que se obliga a valores enteros en operaciones aritméticas (con FALSE = 0, TRUE = 1). Podemos usar esto para averiguar cuántos valores faltantes hay:
sum(is.na(vec))
# [1] 1
Extendiendo este enfoque, podemos usar colSums y is.na en un marco de datos para contar las NA por columna:
colSums(is.na(airquality))
# Ozone Solar.R Wind Temp Month Day
# 37 7 0 0 0 0
El paquete naniar (actualmente en github pero no CRAN) ofrece herramientas adicionales para explorar los valores perdidos.
Lectura y escritura de datos con valores de NA.
Al leer conjuntos de datos tabulares con las funciones de read.* , R busca automáticamente los valores faltantes que se parecen a "NA" . Sin embargo, los valores faltantes no siempre están representados por NA . A veces, un punto ( . ), Un guión ( - ) o un valor de carácter (por ejemplo: empty ) indican que un valor es NA . El parámetro na.strings de la función read.* Se puede usar para indicar a R qué símbolos / caracteres deben tratarse como valores de NA :
read.csv("name_of_csv_file.csv", na.strings = "-")
También es posible indicar que más de un símbolo debe leerse como NA :
read.csv('missing.csv', na.strings = c('.','-'))
De manera similar, las NA pueden escribirse con cadenas personalizadas usando el argumento na para write.csv . Otras herramientas para leer y escribir mesas tienen opciones similares.
Usando NAs de diferentes clases.
El símbolo NA es para un valor logical perdido:
class(NA)
#[1] "logical"
Esto es conveniente, ya que puede ser fácilmente coaccionado a otros tipos de vectores atómicos, y por lo tanto, generalmente es el único NA que necesitará:
x <- c(1, NA, 1)
class(x[2])
#[1] "numeric"
Si necesita un solo valor de NA de otro tipo, use NA_character_ , NA_integer_ , NA_real_ o NA_complex_ . Para los valores faltantes de las clases de fantasía, el subconjunto con NA_integer_ suele funcionar; por ejemplo, para obtener una fecha de valor faltante:
class(Sys.Date()[NA_integer_])
# [1] "Date"
VERDADERO / FALSO y / o NA
NA es un tipo lógico y un operador lógico con una NA devolverá NA si el resultado es ambiguo. A continuación, NA OR TRUE evalúa como TRUE porque al menos un lado lo evalúa como TRUE , sin embargo NA OR FALSE devuelve NA porque no sabemos si NA hubiera sido TRUE o FALSE
NA | TRUE
# [1] TRUE
# TRUE | TRUE is TRUE and FALSE | TRUE is also TRUE.
NA | FALSE
# [1] NA
# TRUE | FALSE is TRUE but FALSE | FALSE is FALSE.
NA & TRUE
# [1] NA
# TRUE & TRUE is TRUE but FALSE & TRUE is FALSE.
NA & FALSE
# [1] FALSE
# TRUE & FALSE is FALSE and FALSE & FALSE is also FALSE.
Estas propiedades son útiles si desea subcontratar un conjunto de datos basado en algunas columnas que contienen NA .
df <- data.frame(v1=0:9,
v2=c(rep(1:2, each=4), NA, NA),
v3=c(NA, letters[2:10]))
df[df$v2 == 1 & !is.na(df$v2), ]
# v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
df[df$v2 == 1, ]
v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
#NA NA NA <NA>
#NA.1 NA NA <NA>
Omitir o reemplazar valores perdidos
Recodificación de valores perdidos
Regularmente, los datos faltantes no se codifican como NA en los conjuntos de datos. En SPSS, por ejemplo, los valores que faltan a menudo se representan con el valor 99 .
num.vec <- c(1, 2, 3, 99, 5)
num.vec
## [1] 1 2 3 99 5
Es posible asignar directamente NA usando subconjuntos
num.vec[num.vec == 99] <- NA
Sin embargo, el método preferido es utilizar is.na<- como se muestra a continuación. El archivo de ayuda ( ?is.na ) indica:
is.na<-puede proporcionar una forma más segura de establecer la falta. Se comporta de manera diferente por factores, por ejemplo.
is.na(num.vec) <- num.vec == 99
Ambos metodos regresan
num.vec
## [1] 1 2 3 NA 5
Eliminar valores perdidos
Los valores que faltan se pueden eliminar de varias formas de un vector:
num.vec[!is.na(num.vec)]
num.vec[complete.cases(num.vec)]
na.omit(num.vec)
## [1] 1 2 3 5
Excluyendo los valores faltantes de los cálculos.
Cuando se usan funciones aritméticas en vectores con valores faltantes, se devolverá un valor faltante:
mean(num.vec) # returns: [1] NA
El parámetro na.rm le dice a la función que excluya los valores de NA del cálculo:
mean(num.vec, na.rm = TRUE) # returns: [1] 2.75
# an alternative to using 'na.rm = TRUE':
mean(num.vec[!is.na(num.vec)]) # returns: [1] 2.75
Algunas funciones de R, como lm , tienen un parámetro na.action . El valor predeterminado para esto es na.omit , pero con las options(na.action = 'na.exclude') se puede cambiar el comportamiento predeterminado de R.
Si no es necesario cambiar el comportamiento predeterminado, pero para una situación específica se necesita otra na.action , el parámetro na.action debe incluirse en la llamada a la función, por ejemplo:
lm(y2 ~ y1, data = anscombe, na.action = 'na.exclude')