При попытке заменить значения "недопустимые значения недопустимы для индексированных присвоений кадров данных",

У меня есть таблица с двумя столбцами: были ли вы больны (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