Tengo una tabla de datos A que tiene una columna right_date. Cuando miro la columna right_date, parece que hay 486 valores faltantes en ella. Pero cuando dejo caer las filas con valores faltantes en la columna right_date de A, con na.omit(A, cols="right_date") de página de documentación de R, luego se eliminan 1.156 filas.

No sé por qué está pasando esto. parece que DataCombine::DropNA(DT, Var="") es consistente con los valores faltantes solo en right_date_vect, elimina 486 filas.

Aquí están los datos si desea probar https://drive.google .com / file / d / 1diq9ctwen6jqfRFlV24qG8PKqdFcBqhu / view? usp = sharing

enter image description here

1
OverFlow Police 23 nov. 2019 a las 02:01

1 respuesta

La mejor respuesta

El objeto "A" de la pregunta no era, de hecho, una tabla de datos. na.omit() es un método genérico, y los puntos pueden devorar argumentos adicionales. Entonces, aunque no se arrojó ningún error, en su lugar se llamó a na.omit.matrix() o na.omit.data.frame(), lo que omitiría cualquier fila con un valor NA.

Esta es una maldición del sistema S3 que puede morderte. Cuando recibo un resultado inesperado, lo primero que hago es, por ejemplo, ejecutar na.omit (sin paréntesis) en la consola. Esto imprimirá la definición de la función. Si veo algo como UseMethod("na.omit"), eso indica que el comportamiento difiere según la clase, entonces verifico la clase de mi objeto.

El paquete R puntos suspensivos tiene como objetivo abordar esta deficiencia. . A continuación se muestra una forma de evitar que esto vuelva a suceder (¡basado mucho en ese archivo Léame!)

library(data.table)
library(ellipsis)
mat <- matrix(c(1, 2, 3, NA), nrow = 2)
colnames(mat) <- c("a", "b")
safe_na.omit <- function(object, ...) {
  check_dots_used()
  na.omit(object, ...)
}

safe_na.omit(mat, col = "a")
#> Error: 1 components of `...` were not used.
#> 
#> We detected these problematic arguments:
#> * `col`
#> 
#> Did you misspecify an argument?

dt <- as.data.table(mat)
safe_na.omit(dt, cols = "a")
#>    a  b
#> 1: 1  3
#> 2: 2 NA
1
smingerson 23 nov. 2019 a las 01:08