Как исправить в 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')),
                 dots=c(99, 90, 86, 88, 95))

#view data frame
df

  team points
1 to 99
2 to 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

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

Теперь предположим, что мы пытаемся добавить новую строку в конец фрейма данных, используя значение «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 to 99
2 to 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 to 99
2 to 90
3 B 86
4 B 88
5 B 95
6 C 100

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

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

 #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: замена имеет нулевую длину

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *