Estoy escribiendo una función, que necesita una comprobación acerca de si (y que!) columna (variable) tiene todos los valores que faltan (NA, <NA>). El siguiente es un fragmento de la función:

test1 <- data.frame (matrix(c(1,2,3,NA,2,3,NA,NA,2), 3,3))
test2 <- data.frame (matrix(c(1,2,3,NA,NA,NA,NA,NA,2), 3,3))

na.test <-  function (data) {
  if (colSums(!is.na(data) == 0)){
      stop ("The some variable in the dataset has all missing value,
     remove the column to proceed")
      }
      }
na.test (test1)

Warning message:
In if (colSums(!is.na(data) == 0)) { :
  the condition has length > 1 and only the first element will be used

P1: ¿por Qué es el error anterior y las revisiones ?

P2: ¿hay alguna manera de encontrar que de las columnas tienen todos los NA, por ejemplo la salida de la lista (nombre de la variable o número de la columna)?

  • Me siento como este debe haber sido contestado antes: algo así como names(data)[lapply(data,function(x) all(is.na(x)))]
  • Su paréntesis están equivocados. Escribir colSums(!is.na(data)) == 0 en lugar de colSums(!is.na(data) == 0).
InformationsquelleAutor SHRram | 2012-07-04

6 Comentarios

  1. 34

    Esto es bastante fácil con sapply y una pequeña función anónima:

    sapply(test1, function(x)all(is.na(x)))
       X1    X2    X3 
    FALSE FALSE FALSE 
    
    sapply(test2, function(x)all(is.na(x)))
       X1    X2    X3 
    FALSE  TRUE FALSE 

    Y dentro de una función:

    na.test <-  function (x) {
      w <- sapply(x, function(x)all(is.na(x)))
      if (any(w)) {
        stop(paste("All NA in columns", paste(which(w), collapse=", ")))
      }
    }
    
    na.test(test1)
    
    na.test(test2)
    Error in na.test(test2) : All NA in columns 2
    • gracias, me la intención de poner como parte de la función, por lo que la función de parada si hay alguna VERDAD…que es importante para mí, ya que tiene un gran conjunto de datos con > 50000 variables
    • He editado mi respuesta para incluir el uso dentro de una función
    • Usted también puede ser capaz de reducir el número de cálculos por señalar que una de las columnas compuestas sólo NA será de class logical. Además, si usted no espera que ninguna otra lógica columnas, a continuación, esto le da la NA columnas.
    • gracias, perfecto !!
    • que puede ser frágil. Hay ‘clasificado’ versiones de NA, tales como NA_integer_, que se muestran como NA pero no son lógicas. Es posible que dependiendo del lugar de la NAs vino de …
    • Ah, buen punto.
    • Soy yo, o esta solución sólo se devolverá «TRUE» cuando TODOS los elementos de la columna son de NA, en lugar de la solicitud inicial (que devuelva true si CUALQUIER elemento fue NA)? Yo sólo probé una de datos.el marco de dos filas con NAs en ellos, y obtuvo un retorno establece que me decía que no había NAs en cualquier columna.
    • Sí, esa era la cuestión que plantea. Si desea devolver TRUE si uno o más de los valores que faltan, uso any() en lugar de all().

  2. 7

    En dplyr

    ColNums_NotAllMissing <- function(df){ # helper function
      as.vector(which(colSums(is.na(df)) != nrow(df)))
    }
    
    df %>%
    select(ColNums_NotAllMissing(.))
    
    example:
    x <- data.frame(x = c(NA, NA, NA), y = c(1, 2, NA), z = c(5, 6, 7))
    
    x %>%
    select(ColNums_NotAllMissing(.))

    o, al revés

    Cols_AllMissing <- function(df){ # helper function
      as.vector(which(colSums(is.na(df)) == nrow(df)))
    }
    
    
    x %>%
      select(-Cols_AllMissing(.))
  3. 6

    Para encontrar las columnas con todos los valores que faltan

     allmisscols <- apply(dataset,2, function(x)all(is.na(x)));  
     colswithallmiss <-names(allmisscols[allmisscols>0]);    
     print("the columns with all values missing");    
     print(colswithallmiss);
  4. 3

    Para probar si las columnas tienen todos los valores que faltan:

    apply(test1,2,function(x) {all(is.na(x))})

    Para conseguir que las columnas tienen todos los valores que faltan:

      test1.nona <- test1[ , colSums(is.na(test1)) == 0]
  5. 0

    El siguiente comando le da un bonito tabla con las columnas que tienen valores de NA:

    sapply(dataframe, function(x)all(any(is.na(x))))

    Es una mejora para la primera respuesta que recibió, que no funciona correctamente a partir de algunos casos.

  6. 0

    dplyr enfoque para encontrar el número de NAs para cada columna:

    df %>% 
      summarise_all((funs(sum(is.na(.))))) 

Dejar respuesta

Please enter your comment!
Please enter your name here