2013-05-29 6 views
95

Ich verstehe nicht, warum ich diese Warnmeldung erhalten habe.Warnmeldung: In `...`: ungültige Faktorstufe, NA generiert

> 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 

Antwort

150

Die Warnmeldung ist, weil Ihr „Typ“ Variable einen Faktor und „Mittagessen“ war kein definiertes Niveau gemacht wurde. Verwenden Sie das Flag stringsAsFactors = FALSE, wenn Sie Ihren Datenrahmen so konfigurieren, dass "Type" als Zeichen festgelegt wird.

> 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

Da dies die Standardeinstellung in der 'data.frame()' Funktion ist (und es ist Standard, weil das das ist, was die meisten Benutzer die überwiegende Mehrheit der Zeit wollen). – David

34

Wenn Sie direkt aus der CSV-Datei lesen, dann mögen Sie das.

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

Dies ist ein flexiblen Ansatz, kann es in allen Fällen verwendet werden, insbesondere:

  1. Sie wollen einfach nur eine Spalte oder
  2. die data.frame hat dazu geführt, beeinflussen von vorherigen Operationen anwenden (zB nicht sofort eine Datei öffnen oder Ihren Datenrahmen erstellen).

Zuerst un-factorize eine Zeichenfolge mit der as.character Funktion, 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) 
3

Des Um dies zu beheben, fügen Sie Ihrer Spalte einen neuen Faktor hinzu. 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" 
Verwandte Themen