Как исправить в R: неверный факторный уровень, создано NA


Одно предупреждающее сообщение, с которым вы можете столкнуться при использовании R:

Warning message:
In `[<-.factor`(`\*tmp\*`, iseq, value = "C") :
 invalid factor level, NA generated

Это предупреждение появляется, когда вы пытаетесь добавить значение к факторной переменной в R, которая еще не существует как определенный уровень.

В следующем примере показано, как устранить это предупреждение на практике.

Как воспроизвести предупреждение

Предположим, у нас есть следующий фрейм данных в R:

#create data frame
df <- data.frame(team=factor(c('A', 'A', 'B', 'B', 'B')),
 points=c(99, 90, 86, 88, 95))

#view data frame
df

 team points
1 A 99
2 A 90
3 B 86
4 B 88
5 B 95

#view structure of data frame
str(df)

'data.frame': 5 obs. of 2 variables:
 $ team : Factor w/ 2 levels "A","B": 1 1 2 2 2
 $ points: num 99 90 86 88 95

Мы видим, что переменная team представляет собой фактор с двумя уровнями: «A» и «B».

Теперь предположим, что мы пытаемся добавить новую строку в конец фрейма данных, используя значение «C» для команды :

#add new row to end of data frame
df[nrow(df) + 1,] = c('C', 100)

Warning message:
In `[<-.factor`(`\*tmp\*`, iseq, value = "C") :
 invalid factor level, NA generated

Мы получаем предупреждающее сообщение, потому что значение «C» еще не существует в качестве уровня фактора для переменной команды .

Важно отметить, что это просто предупреждающее сообщение, и R по-прежнему добавит новую строку в конец фрейма данных, но будет использовать значение NA вместо «C»:

#view updated data frame
df

 team points
1 A 99
2 A 90
3 B 86
4 B 88
5 B 95
6 NA 100

Как избежать предупреждения

Чтобы избежать предупреждения о недопустимом уровне фактора , мы должны сначала преобразовать переменную фактора в символьную переменную, а затем мы можем преобразовать ее обратно в переменную фактора после добавления новой строки:

#convert team variable to character
df$team <- as. character (df$team)

#add new row to end of data frame
df[nrow(df) + 1,] = c('C', 100)

#convert team variable back to factor
df$team <- as. factor (df$team)

#view updated data frame
df

 team points
1 A 99
2 A 90
3 B 86
4 B 88
5 B 95
6 C 100

Обратите внимание, что мы можем успешно добавить новую строку в конец фрейма данных и избежать предупреждающего сообщения.

Мы также можем проверить, что значение «C» было добавлено в качестве уровня фактора к переменной team :

#view structure of updated data frame
str(df)

'data.frame': 6 obs. of 2 variables:
 $ team : Factor w/ 3 levels "A","B","C": 1 1 2 2 2 3
 $ points: chr "99" "90" "86" "88" ...

Дополнительные ресурсы

В следующих руководствах объясняется, как исправить другие распространенные ошибки в R:

Как исправить в R: аргументы подразумевают разное количество строк
Как исправить в R: ошибка выбора неиспользуемых аргументов
Как исправить в R: замена имеет нулевую длину

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.