Messaggio di avviso: In `…`: livello fattore non valido, NA generato


135

Non capisco perché ho ricevuto questo messaggio di avviso.

> 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

Risposte:


216

Il messaggio di avviso è perché la variabile "Tipo" è stata considerata un fattore e "pranzo" non era un livello definito. Usa la stringsAsFactors = FALSEbandiera quando crei il tuo frame di dati per forzare "Tipo" come personaggio.

> 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 Perché R lo converte in fattore?
KannarKK,

1
Perché questa è l'impostazione predefinita nella data.frame()funzione (ed è predefinita perché è ciò che la maggior parte degli utenti desidera la maggior parte delle volte).
David,

46

Se stai leggendo direttamente dal file CSV, fai così.

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

stringAsFactors sta generando un errore: argomento inutilizzato (stringAsFactors = FALSE)
Coliban

1
stringsAsFactors- stringsdeve essere plurale (@Coliban)
campeterson

24

Ecco un approccio flessibile , può essere utilizzato in tutti i casi, in particolare:

  1. ad interessare solo una colonna , o
  2. la dataframeè stata ottenuta applicando precedenti operazioni (ad esempio non immediatamente apertura di un file , o creando un nuovo frame di dati).

Innanzitutto, decomprimere una stringa usando la as.characterfunzione e, quindi, ricodificare con la funzione as.factor(o semplicemente 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

Il modo più semplice per risolvere questo problema è aggiungere un nuovo fattore alla colonna. Utilizzare la funzione dei livelli per determinare quanti fattori si hanno e quindi aggiungere un nuovo fattore.

    > 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

Ho un problema simile con i dati recuperati dal file .xlsx. Sfortunatamente, non sono riuscito a trovare la risposta corretta qui. L'ho gestito da solo con dplyr come di seguito che potrebbe aiutare gli altri:

#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"

Tuttavia, non sono riuscito a gestirlo con il readxlpacchetto che non ha un parametro simile al stringsAsFactors. Per il motivo, sono passato al xlsxpacchetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.