Komunikat ostrzegawczy: W `…`: nieprawidłowy poziom czynnika, wygenerowano NA

136

Nie rozumiem, dlaczego otrzymałem to ostrzeżenie.

> 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
źródło

Odpowiedzi:

217

Komunikat ostrzegawczy jest taki, że zmienna „Typ” została utworzona jako czynnik, a „obiad” nie był zdefiniowanym poziomem. Użyj stringsAsFactors = FALSEflagi podczas tworzenia ramki danych, aby wymusić „Typ” na znaku.

> 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
źródło
1
@David Dlaczego R zamienia go na czynnik?
KannarKK
1
Ponieważ jest to domyślne ustawienie data.frame()funkcji (i jest to ustawienie domyślne, ponieważ większość użytkowników tego chce przez większość czasu).
David
46

Jeśli czytasz bezpośrednio z pliku CSV, zrób to w ten sposób.

myDataFrame <- read.csv("path/to/file.csv", header = TRUE, stringsAsFactors = FALSE)
Chirag
źródło
stringAsFactors generuje błąd: nieużywany argument (stringAsFactors = FALSE)
Coliban
1
stringsAsFactors- stringsmusi być w liczbie mnogiej (@Coliban)
campeterson
25

Oto elastyczne podejście , które można zastosować we wszystkich przypadkach, w szczególności:

  1. na wpływ tylko jednej kolumny , czy
  2. dataframeotrzymano ze stosowania poprzednich operacji (np nie od razu otwarcia pliku , lub tworzenia nowej ramki danych).

Najpierw rozfaktoryzuj ciąg za pomocą as.characterfunkcji, a następnie ponownie rozfaktoryzuj za pomocą as.factor(lub po prostu factor) funkcji:

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
źródło
6

Najłatwiejszym sposobem rozwiązania tego problemu jest dodanie nowego czynnika do kolumny. Użyj funkcji poziomów, aby określić, ile masz czynników, a następnie dodaj nowy współczynnik.

    > 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
źródło
0

Mam podobny problem z danymi pobranymi z pliku .xlsx. Niestety nie mogłem znaleźć tutaj właściwej odpowiedzi. Poradziłem sobie z tym samodzielnie za pomocą programu dplyr, jak poniżej, co może pomóc innym:

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

Jednak nie mogłem sobie z tym poradzić z readxlpakietem, który nie ma podobnego parametru do stringsAsFactors. Z tego powodu przeniosłem się do xlsxpakietu.

ozturkib
źródło