Mensaje de advertencia: En `...`: nivel de factor no válido, NA generado


135

No entiendo por qué recibí este mensaje de advertencia.

> fixed <- data.frame("Type" = character(3), "Amount" = numeric(3))
> fixed[1, ] <- c("lunch", 100)
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "lunch") :
  invalid factor level, NA generated
> fixed
  Type Amount
1 <NA>    100
2           0
3           0

Respuestas:


216

El mensaje de advertencia se debe a que su variable "Tipo" se convirtió en un factor y "almuerzo" no era un nivel definido. Use la stringsAsFactors = FALSEbandera cuando cree su marco de datos para forzar que "Tipo" sea un carácter.

> fixed <- data.frame("Type" = character(3), "Amount" = numeric(3))
> str(fixed)
'data.frame':   3 obs. of  2 variables:
 $ Type  : Factor w/ 1 level "": NA 1 1
 $ Amount: chr  "100" "0" "0"
> 
> fixed <- data.frame("Type" = character(3), "Amount" = numeric(3),stringsAsFactors=FALSE)
> fixed[1, ] <- c("lunch", 100)
> str(fixed)
'data.frame':   3 obs. of  2 variables:
 $ Type  : chr  "lunch" "" ""
 $ Amount: chr  "100" "0" "0"

1
@David ¿Por qué R lo convierte en Factor?
KannarKK

1
Porque esa es la configuración predeterminada en la data.frame()función (y es predeterminada porque eso es lo que la mayoría de los usuarios desean la gran mayoría de las veces).
David

46

Si está leyendo directamente desde un archivo CSV, haga lo siguiente.

myDataFrame <- read.csv("path/to/file.csv", header = TRUE, stringsAsFactors = FALSE)

stringAsFactors está arrojando un error: argumento no utilizado (stringAsFactors = FALSE)
Coliban

1
stringsAsFactors- stringsnecesita ser plural (@Coliban)
campeterson

24

Aquí hay un enfoque flexible , se puede utilizar en todos los casos, en particular:

  1. para afectar solo una columna , o
  2. el dataframese ha obtenido a partir de la aplicación de las operaciones anteriores (por ejemplo, no abrir inmediatamente un archivo , o la creación de una nueva trama de datos).

Primero, desfactorice una cadena usando la as.characterfunción y, luego, vuelva a factorizar con la función as.factor(o simplemente factor):

fixed <- data.frame("Type" = character(3), "Amount" = numeric(3))

# Un-factorize (as.numeric can be use for numeric values)
#              (as.vector  can be use for objects - not tested)
fixed$Type <- as.character(fixed$Type)
fixed[1, ] <- c("lunch", 100)

# Re-factorize with the as.factor function or simple factor(fixed$Type)
fixed$Type <- as.factor(fixed$Type)

6

La forma más fácil de solucionar esto es agregar un nuevo factor a su columna. Use la función de niveles para determinar cuántos factores tiene y luego agregue un nuevo factor.

    > levels(data$Fireplace.Qu)
    [1] "Ex" "Fa" "Gd" "Po" "TA"
    > levels(data$Fireplace.Qu) = c("Ex", "Fa", "Gd", "Po", "TA", "None")
    [1] "Ex"   "Fa"   "Gd"   "Po"   " TA"  "None"

0

Tengo un problema similar que los datos recuperados del archivo .xlsx. Desafortunadamente, no pude encontrar la respuesta correcta aquí. Lo manejé solo con dplyr como a continuación, lo que podría ayudar a otros:

#install.packages("xlsx")
library(xlsx)
extracted_df <- read.xlsx("test.xlsx", sheetName='Sheet1', stringsAsFactors=FALSE)
# Replace all NAs in a data frame with "G" character
extracted_df[is.na(extracted_df)] <- "G"

Sin embargo, no pude manejarlo con el readxlpaquete que no tiene un parámetro similar al stringsAsFactors. Por la razón, me mudé al xlsxpaquete.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.