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