Как исправить в R: отсутствующие значения не допускаются в назначениях с индексами


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

Error in `[<-.data.frame`(`\*tmp\*`, df$A == 5, , value = list(A = c(NA, : 
 missing values are not allowed in subscripted assignments of data frames

Эта ошибка обычно возникает, когда вы пытаетесь присвоить значения в одном столбце, используя значения из другого столбца, но там присутствуют значения NA .

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

Как воспроизвести ошибку

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

#create data frame
df <- data.frame(A=c(3, 4, 4, NA, 5, 8, 5, 9),
 B=c(12, 13, 7, 7, 12, 11, 15, 7))

#view data frame
df

 A B
1 3 12
2 4 13
3 4 7
4 NA 7
5 5 12
6 8 11
7 5 15
8 9 7

Теперь предположим, что мы пытаемся присвоить значение 10 каждой строке в столбце B, где соответствующее значение в столбце A равно 5:

#attempt to assign column B a value of 10 where A is equal to 5
df[df$A == 5, ]$B <- 10

Error in `[<-.data.frame`(`\*tmp\*`, df$A == 5, , value = list(A = c(NA, : 
 missing values are not allowed in subscripted assignments of data frames

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

Как избежать ошибки

Есть два способа избежать этой ошибки.

1. Используйте оператор %in%

Один из способов избежать этой ошибки — использовать оператор %in% при выполнении присваивания:

#assign column B a value of 10 where A is equal to 5
df[df$A %in% 5,]$B <- 10

#view updated data frame
df

 A B
1 3 12
2 4 13
3 4 7
4 NA 7
5 5 10
6 8 11
7 5 10
8 9 7

Обратите внимание, что значение 10 было присвоено каждой строке в столбце B, где соответствующее значение в столбце A равно 5, и мы не получаем никакой ошибки.

2. Используйте is.na()

Другой способ избежать этой ошибки — использовать функцию is.na() при выполнении присваивания:

#assign column B a value of 10 where A is equal to 5
df[!is.na(df$A) & df$A == 5, ]$B <- 10

#view updated data frame
df

 A B
1 3 12
2 4 13
3 4 7
4 NA 7
5 5 10
6 8 11
7 5 10
8 9 7

Мы снова можем присвоить значение 10 каждой строке в столбце B, где соответствующее значение в столбце A равно 5, и мы не получим никакой ошибки.

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

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

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

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