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

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"

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)

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)

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"

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.