Предупреждающее сообщение: В `…`: недопустимый уровень фактора, сгенерировано 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 конвертирует его в Factor?
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.