Попереджувальне повідомлення: В `… ': недійсний рівень фактора, генерований NA


135

Я не розумію, чому я отримав це попередження.

> 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

Відповіді:


216

Попереджувальне повідомлення пояснюється тим, що ваша змінна "Тип" стала фактором, а "обід" не був визначеним рівнем. Використовуйте stringsAsFactors = FALSEпрапор під час створення кадру даних, щоб змусити "Тип" бути символом.

> 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 Чому R перетворює його у фактор?
KannarKK

1
Тому що це налаштування за замовчуванням у data.frame()функції (і це за замовчуванням, тому що саме те, що більшість користувачів хоче більшість часу).
Девід

46

Якщо ви читаєте безпосередньо з файлу CSV, зробіть це так.

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

stringAsFactors кидає помилку: невикористаний аргумент (stringAsFactors = FALSE)
Coliban

1
stringsAsFactors- stringsмає бути множиною (@Coliban)
campeterson

24

Ось гнучкий підхід , його можна використовувати у всіх випадках, зокрема:

  1. щоб торкатися лише один стовпець , або
  2. dataframeбуло отримано в результаті застосування попередніх операцій (наприклад , не відразу відкрити файл , або створити новий фрейм даних).

Спочатку нефакторизуйте рядок за допомогою as.characterфункції, а потім повторно розподіліть за допомогою функції as.factor(або просто 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

Найпростіший спосіб виправити це - додати новий коефіцієнт до стовпця. За допомогою функції рівнів визначте, скільки факторів у вас є, а потім додайте новий коефіцієнт.

    > 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

У мене є аналогічна проблема, дані якої отримані з файлу .xlsx. На жаль, тут не вдалося знайти належної відповіді. Я впорався з цим самостійно за допомогою dplyr, як нижче, що може допомогти іншим:

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

Однак я не зміг обробити це з readxlпакетом, який не має аналогічного параметра stringsAsFactors. З цієї причини я перейшов до xlsxпакету.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.