When trying to replace values, “missing values are not allowed in subscripted assignments of data frames”

前端 未结 6 1589
日久生厌
日久生厌 2021-02-01 14:31

I have a table that has two columns: whether you were sick (H01) and the number of days sick (H03). However, the number of days sick is NA if H01 == false, and I would like to s

6条回答
  •  爱一瞬间的悲伤
    2021-02-01 15:04

    It is due to missingness in H01 variable.

    > 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
    

    The assignment won't work because x$a has a missing value.

    Subsetting first works:

    > z <- x[x$a==2,]
    > z$b <- 99
    > z <- x[x$a==2,]
    > z
        a  b
    NA NA NA
    2   2  2
    

    But that's because the [<- function apparently can't handle missing values in its extraction indices, even though [ can:

    > `[<-`(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
    

    So instead, trying specifying your !is.na(x$a) part when you're doing the assignment:

    > `[<-`(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
    

    Or, more commonly:

    > 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
    

    Note that this behavior is described in the documentation:

    The replacement methods can be used to add whole column(s) by specifying non-existent column(s), in which case the column(s) are added at the right-hand edge of the data frame and numerical indices must be contiguous to existing indices. On the other hand, rows can be added at any row after the current last row, and the columns will be in-filled with missing values. Missing values in the indices are not allowed for replacement.

提交回复
热议问题