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
ihm
fuente

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"
David
fuente
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)
Chirag
fuente
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)
toto_tico
fuente
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"
Eddie Miller
fuente
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.

ozturkib
fuente