Warnmeldung: In `…`: ungültige Faktorstufe wurde NA generiert

134

Ich verstehe nicht, warum ich diese Warnmeldung erhalten habe.

> 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
quelle

Antworten:

215

Die Warnmeldung ist, weil Ihre Variable "Typ" zu einem Faktor gemacht wurde und "Mittagessen" keine definierte Ebene war. Verwenden Sie das stringsAsFactors = FALSEFlag, wenn Sie Ihren Datenrahmen erstellen, um zu erzwingen, dass "Typ" ein Zeichen ist.

> 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
quelle
1
@ David Warum konvertiert R es in Faktor?
KannarKK
1
Weil dies die Standardeinstellung in der data.frame()Funktion ist (und es ist die Standardeinstellung, weil dies die meisten Benutzer die meiste Zeit wollen).
David
46

Wenn Sie direkt aus der CSV-Datei lesen, gehen Sie folgendermaßen vor.

myDataFrame <- read.csv("path/to/file.csv", header = TRUE, stringsAsFactors = FALSE)
Chirag
quelle
stringAsFactors gibt einen Fehler aus: unbenutztes Argument (stringAsFactors = FALSE)
Coliban
1
stringsAsFactors- stringsMuss Plural sein (@Coliban)
Campeterson
24

Hier ist ein flexibler Ansatz , der in allen Fällen verwendet werden kann, insbesondere:

  1. beeinflussen nur eine Spalte oder
  2. das dataframewurde von der Anwendung vorherigen Operationen erhalten (zB nicht sofort das Öffnen einer Datei oder ein neues Datenrahmen erstellen).

Zuerst un-Faktorisierung einen String mit der as.characterFunktion, und dann wieder factorize mit der as.factor(oder einfach factor) Funktion:

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
quelle
6

Der einfachste Weg, dies zu beheben, besteht darin, Ihrer Spalte einen neuen Faktor hinzuzufügen. Verwenden Sie die Ebenenfunktion, um zu bestimmen, wie viele Faktoren Sie haben, und fügen Sie dann einen neuen Faktor hinzu.

    > 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
quelle
0

Ich habe ein ähnliches Problem, welche Daten aus der XLSX-Datei abgerufen wurden. Leider konnte ich hier nicht die richtige Antwort finden. Ich habe es alleine mit dplyr wie folgt gehandhabt, was anderen helfen könnte:

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

Ich konnte es jedoch nicht mit dem readxlPaket handhaben, das keinen ähnlichen Parameter wie das hat stringsAsFactors. Aus dem Grund bin ich zum xlsxPaket übergegangen.

ozturkib
quelle