Недопустимый уровень фактора, генерируемый NA

Я не понимаю, почему я получил это сообщение об ошибке.

> 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

Ответ 1

Сообщение об ошибке связано с тем, что ваша переменная "Тип" была сделана фактором, а "обед" не был определенным уровнем. Используйте флаг 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"

Ответ 2

и если вы читаете непосредственно из CSV файла, тогда сделайте так.

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

Ответ 3

"Нефакторизовать" строку с помощью функции 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)

Этот гибкий подход, он может использоваться во всех случаях, в частности:

  • вы просто хотите повлиять на один столбец или
  • data.frame возник из-за применения предыдущих операций (например, не сразу открывать файл или создавать фрейм данных).

Ответ 4

Самый простой способ исправить это - добавить новый фактор в свой столбец. Используйте функцию уровней, чтобы определить, сколько факторов у вас есть, а затем добавить новый фактор.

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