При попытке заменить значения "недопустимые значения недопустимы для индексированных присвоений кадров данных",
У меня есть таблица с двумя столбцами: были ли вы больны (H01) и количество дней болезни (H03). Тем не менее, число дней болезни - это NA, если H01 == false, и я хотел бы установить его равным 0. Когда я это делаю:
test <- pe94.person[pe94.person$H01 == 12,]
test$H03 <- 0
Он работает нормально. Однако я хотел бы заменить значения в исходном фрейме. Это, однако, не удается:
pe94.person[pe94.person$H01 == 12,]$H03 <- 0
Он возвращает:
> pe94.person[pe94.person$H01 == 12,]$H03 <- 0
Error in '[<-.data.frame'('*tmp*', pe94.person$H01 == 12, , value = list( :
missing values are not allowed in subscripted assignments of data frames
Любая идея, почему это так? Для чего это стоит, здесь частотная таблица:
> table(pe94.person[pe94.person$H01 == 12,]$H03)
2 3 5 28
3 1 1 1
Ответы
Ответ 1
Вы можете использовать ifelse
, например
pe94.person$foo <- ifelse(!is.na(pe94.person$H01) & pe94.person$H01 == 12, 0, pe94.person$H03)
проверьте, соответствует ли foo вашим критериям, а затем pe94.person$H03
его прямо на pe94.person$H03
. Я считаю безопаснее назначать ему новую переменную и обычно использовать ее в последующем анализе.
Ответ 2
Это связано с H01
переменной H01
.
> x <- data.frame(a=c(NA,2:5), b=c(1:5))
> x
a b
1 NA 1
2 2 2
3 3 3
4 4 4
5 5 5
> x[x$a==2,]$b <- 99
Error in '[<-.data.frame'('*tmp*', x$a == 1, , value = list(a = NA_integer_, :
missing values are not allowed in subscripted assignments of data frames
Назначение не будет работать, потому что x$a
имеет отсутствующее значение.
Подмножество первых работ:
> z <- x[x$a==2,]
> z$b <- 99
> z <- x[x$a==2,]
> z
a b
NA NA NA
2 2 2
Но это потому, что [<-
функция, по-видимому, не может обрабатывать недостающие значения в своих индексах извлечения, хотя [
может:
> '[<-'(x,x$a==2,,99)
Error in '[<-.data.frame'(x, x$a == 2, , 99) :
missing values are not allowed in subscripted assignments of data frames
Поэтому вместо того, чтобы !is.na(x$a)
указать свою часть !is.na(x$a)
:
> '[<-'(x,!is.na(x$a) & x$a==2,'b',99)
a b
1 NA 1
2 2 99
3 3 3
4 4 4
5 5 5
Или, чаще:
> x[!is.na(x$a) & x$a==2,]$b <- 99
> x
a b
1 NA 1
2 2 99
3 3 3
4 4 4
5 5 5
Обратите внимание, что это поведение описано в документации:
Методы замещения могут быть использованы для добавления целого столбца (ов) путем указания несуществующего столбца (ов), и в этом случае столбцы (столбцы) добавляются в правый край кадра данных, а числовые индексы должны быть смежными с существующие индексы. С другой стороны, строки могут быть добавлены в любой строке после текущей последней строки, а столбцы будут заполнены отсутствующими значениями. Недопустимые значения в индексах не допускаются для замены.
Ответ 3
Просто используйте функцию subset()
чтобы исключить все NA
из строки.
Он работает как x[subset & !is.na(subset)]
. Посмотрите на эти данные:
> x <- data.frame(a = c(T,F,T,F,NA,F,T, F, NA,NA,T,T,F),
> b = c(F,T,T,F,T, T,NA,NA,F, T, T,F,F))
Подстановка с помощью [
operator возвращает это:
> x[x$b == T & x$a == F, ]
a b
2 FALSE TRUE
NA NA NA
6 FALSE TRUE
NA.1 NA NA
NA.2 NA NA
И subset()
делает то, что мы хотим:
> subset(x, b == T & a == F)
a b
2 FALSE TRUE
6 FALSE TRUE
Чтобы изменить значения подмножеств переменных:
> ss <- subset(x, b == T & a == F)
> x[rownames(ss), 'a'] <- T
> x[c(2,6), ]
a b
2 TRUE TRUE
6 TRUE TRUE
Ответ 4
В столбце может быть NA
, вызывающее ошибку. Запустите индекс в определенном столбце вместо всего кадра данных.
movies[movies$Actors == "N/A",] = NA #ERROR
movies$Actors[movies$Actors == "N/A"] = NA #Works