Tengo un dataframe (14.5 K filas y 15 columnas) que contiene los datos de facturación, de 2001 a 2007.

Me anexar nuevos datos de 2008 con: alltime <- rbind(alltime,all2008)

Por desgracia, que genera una advertencia:

> Warning message:
In `[<-.factor`(`*tmp*`, ri, value = c(NA, NA, NA, NA, NA, NA, NA,  :
  invalid factor level, NAs generated

Mi conjetura es que hay algunos nuevos a los pacientes cuyos nombres no estaban en el anterior dataframe y por lo tanto no sabría qué nivel para dar a esos. Del mismo modo nuevo oculto en los nombres», refiriéndose médico de la columna».

¿Cuál es la solución?

  • Este es impar. Factor no debe hacer esto, en la ayuda a rbind se afirma: «los Factores que tienen sus niveles ampliado» (R-2.9.2). Tal vez usted podría comprobar exactamente la columna por la que provoca esto?
  • Lo que es un gran punto de Marek! El mensaje de advertencia que me asusté. Después de leer tu comentario me fui de nuevo a explorar mis datos. Todos los nuevos datos parece ser que hay y niveles adicionales se han añadido. En esta etapa pude dejarlo como una advertencia de que debe ser ignorada – que es un hábito peligroso para llegar (desde entonces uno tiene que mantener una base de datos en su cabeza de advertencias para ser tomado en serio vs advertencias para ser ignorado). ¿Cómo puedo averiguar dónde está el mensaje de advertencia proviene?
  • «La forma R importaciones de datos y automáticamente lo que es numérico y lo que no lo es (y por lo tanto hace que sea un factor)…» ver read.csv(..., stringsAsFactors=FALSE y options(stringsAsFactors=FALSE). Hay un montón de preguntas sobre ESO.
  • «Advertencia» significa una advertencia, no un error. Puede comprobar si el resultado es el factor correcto uso de str() o de la mesa(…, useNA=’si’). Es mejor dar un reproducible ejemplo (se puede poner una en <10 líneas).
  • Pregunta Similar, Convertir los datos.las columnas del marco de los factores de caracteres
InformationsquelleAutor Farrel | 2009-10-27

7 Comentarios

  1. 30

    Podría ser causada por la falta de coincidencia de tipos en dos data.frames.

    Primera de verificación todos los tipos (clases). Para propósitos de diagnóstico de hacer esto:

    new2old <- rbind( alltime, all2008 ) # this gives you a warning
    old2new <- rbind( all2008, alltime ) # this should be without warning
    
    cbind(
        alltime = sapply( alltime, class),
        all2008 = sapply( all2008, class),
        new2old = sapply( new2old, class),
        old2new = sapply( old2new, class)
    )

    Espero no ser una fila parece:

                alltime  all2008   new2old  old2new
    ...         ...      ...       ...      ...
    some_column "factor" "numeric" "factor" "character"
    ...         ...      ...       ...      ...

    Si es así, entonces la explicación:
    rbind no comprobar los tipos de partido. Si se analiza rbind.data.frame código, a continuación, puede ver que el primer argumento que se inicializan los tipos de salida. Si en la primera los datos.tipo de trama es un factor, entonces los datos de salida.fotograma de la columna es el factor con los niveles de unique(c(levels(x1),levels(x2))). Pero cuando en el segundo de datos.fotograma de la columna no es factor, a continuación, levels(x2) es NULL, por lo que los niveles no se extienden.

    Significa que los datos de salida están equivocados! Hay NA‘s en lugar de los verdaderos valores

    Supongo que:

    1. usted cree que los datos antiguos con otros R/RODBC versión tipos fueron creados con diferentes métodos (diferentes configuraciones separador decimal – tal vez)
    2. hay NULL, o algunos datos específicos en la problemática de la columna, por ejemplo. que alguien cambie de columna en la base de datos.

    Solución:

    encontrar mal de la columna y encontrar la razón de su mal y fijo. Eliminar la causa, no los síntomas.

    • Yip. Estás en lo correcto. en un marco de datos de una columna de la clase fue un factor, y en el otro se trataba de una numérico. Que complicado las cosas mal. Me convierte el valor numérico de un factor y todo estaba bien. Gracias por su orientación. Hubo algunas discrepancias así. Por ejemplo, el factor de carácter discrepancia no desordenar las cosas.
    • Usted tiene derecho sobre el factor de carácter, en algún lugar en el código, he encontrado que los niveles de esta combinación será unique(c(levels(x1),x2)). De una cosa: la combinación del factor de carácter lleva a un factor, la combinación de caracteres factor de caracteres. Así que es mejor cuando los tipos de partido.
  2. 27

    Una forma «fácil» es simplemente no tienen sus cadenas de establecer como factores a la hora de importar datos de texto.

    Tenga en cuenta que el read.{table,csv,...} funciones toman un stringsAsFactors parámetro, que es por defecto TRUE. Puede establecer esta a FALSE mientras que usted está importando y rbind-ción de los datos.

    Si quieres conjunto de la columna a ser un factor en el extremo, usted puede hacer eso también.

    Por ejemplo:

    alltime <- read.table("alltime.txt", stringsAsFactors=FALSE)
    all2008 <- read.table("all2008.txt", stringsAsFactors=FALSE)
    alltime <- rbind(alltime, all2008)
    # If you want the doctor column to be a factor, make it so:
    alltime$doctor <- as.factor(alltime$doctor)
    • Creo que tienes varias error tipográfico en su respuesta…
    • Woops, gracias por señalarlo. Solucionado (creo).
  3. 9

    1) crear el marco de datos con stringsAsFactor establece en FALSE. Esto debería resolver el factor de emisión

    2) después de no usar rbind – se mete hasta los nombres de las columnas si el marco de datos está vacía. simplemente hacerlo de esta manera:

    df[nrow(df)+1,] <- c("d","gsgsgd",4)

    /

    > df <- data.frame(a = character(0), b=character(0), c=numeric(0))
    
    > df[nrow(df)+1,] <- c("d","gsgsgd",4)
    
    Warnmeldungen:
    1: In `[<-.factor`(`*tmp*`, iseq, value = "d") :
      invalid factor level, NAs generated
    2: In `[<-.factor`(`*tmp*`, iseq, value = "gsgsgd") :
      invalid factor level, NAs generated
    
    > df <- data.frame(a = character(0), b=character(0), c=numeric(0), stringsAsFactors=F)
    
    > df[nrow(df)+1,] <- c("d","gsgsgd",4)
    
    > df
      a      b c
    1 d gsgsgd 4
  4. 4

    Como se sugiere en la respuesta anterior, lea las columnas como personaje y hacer la conversión a factores después de rbind.
    SQLFetch (Supongo RODBC) también la stringsAsFactors o la as.is argumento para el control de la conversión de caracteres.
    Los valores permitidos son como para read.table, por ejemplo, as.is=TRUE o algún número de columna.

  5. 3

    Tuve el mismo problema con el tipo de desajustes, especialmente con los factores. Tuve que unir dos de otra manera compatible con los conjuntos de datos.

    Mi solución es convertir los factores en ambos dataframes a «carácter». Entonces funciona como un encanto 🙂

        convert.factors.to.strings.in.dataframe <- function(dataframe)
        {
            class.data  <- sapply(dataframe, class)
            factor.vars <- class.data[class.data == "factor"]
            for (colname in names(factor.vars))
            {
                dataframe[,colname] <- as.character(dataframe[,colname])
            }
            return (dataframe)
        }

    Si quieres ver los tipos en sus dos dataframes ejecutar (cambio var de nombres):

        cbind("orig"=sapply(allSurveyData, class), 
              "merge" = sapply(curSurveyDataMerge, class),
              "eq"=sapply(allSurveyData, class) == sapply(curSurveyDataMerge, class)
        )
    • función muy útil para tener, gracias.
    • mydf[sapply(mydf, is.factor)] <- lapply(mydf[sapply(mydf, is.factor)], as.character) parece un enfoque más sencillo.
  6. 2

    Al crear el dataframe usted tiene la opción de hacer sus columnas de cadena de factores (stringsAsFactors=T), o mantenerlos como cadenas.

    Para su caso, no hace sus columnas de cadena de factores. Mantener como cadenas, a continuación, anexando funciona bien. Si usted necesita de ellos para finalmente ser factores de hacer la inserción y anexando la primera cadena, a continuación, finalmente, convertir a factor.

    Si a las columnas de cadena de factores y, a continuación, agregue las filas que contienen invisible valores, se obtiene el error que se menciona en cada nueva invisible nivel de factor y ese valor se sustituye con NA…

    > df <- data.frame(patient=c('Ann','Bob','Carol'), referring_doctor=c('X','Y','X'), stringsAsFactors=T)
    
      patient referring_doctor
    1     Ann                X
    2     Bob                Y
    3   Carol                X
    
    > df <- rbind(df, c('Denise','Z'))
    Warning messages:
    1: In `[<-.factor`(`*tmp*`, ri, value = "Denise") :
      invalid factor level, NA generated
    2: In `[<-.factor`(`*tmp*`, ri, value = "Z") :
      invalid factor level, NA generated
    > df
      patient referring_doctor
    1     Ann                X
    2     Bob                Y
    3   Carol                X
    4    <NA>             <NA>

    Así no hace sus columnas de cadena de factores. Mantener como cadenas, a continuación, anexando funciona bien:

    > df <- data.frame(patient=c('Ann','Bob','Carol'), referring_doctor=c('X','Y','X'), stringsAsFactors=F)
    > df <- rbind(df, c('Denise','Z'))
      patient referring_doctor
    1     Ann                X
    2     Bob                Y
    3   Carol                X
    4  Denise                Z

    Para cambiar el comportamiento predeterminado:

    options(stringsAsFactors=F)

    Para convertir cada una de las columnas a/de una cuerda o factor de

    df$col <- as.character(df$col)
    df$col <- as.factor(df$col)
  7. 0

    aquí está una función para realizar el común de los nombres de fila de 2 marcos de datos y hacer un rbind donde podemos encontrar básicamente los campos que son factores, agregar los nuevos factores, a continuación, hacer la rbind. Este debe tener cuidado de cualquier factor de cuestiones:

    rbindCommonCols<-function(x, y){

    commonColNames = intersect(colnames(x), colnames(y))
    x = x[,commonColNames]
    y = y[,commonColNames]
    
    colClassesX = sapply(x, class)
    colClassesY = sapply(y, class)
    classMatch = paste( colClassesX, colClassesY, sep = "-" )
    factorColIdx = grep("factor", classMatch)
    
    for(n in factorColIdx){ 
        x[,n] = as.factor(x[,n])
        y[,n] = as.factor(y[,n])
    }
    
    for(n in factorColIdx){ 
        x[,n] = factor(x[,n], levels = unique(c( levels(x[,n]), levels(y[,n]) )))
        y[,n] = factor(y[,n], levels = unique(c( levels(y[,n]), levels(x[,n]) )))  
    } 
    
    res = rbind(x,y)
    res

    }

Dejar respuesta

Please enter your comment!
Please enter your name here