[R] Data frame vs matrix quirk: Hinky error message?

David Winsemius dwinsemius at comcast.net
Tue May 1 23:34:18 CEST 2012


On May 1, 2012, at 1:33 PM, Bert Gunter wrote:

> AdvisoRs:
>
> Is the following a bug, feature, hinky error message, or dumb Bert?
>
>> mtest <- matrix(1:12,nr=4)
>> dftest <- data.frame(mtest)
>> ix <- cbind(1:2,2:3)
>> mtest[ix] <- NA
>> mtest
>    [,1] [,2] [,3]
> [1,]    1   NA    9
> [2,]    2    6   NA
> [3,]    3    7   11
> [4,]    4    8   12
>
> ## But ...
>> dftest[ix] <- NA
> Error in `[<-.data.frame`(`*tmp*`, ix, value = NA) :
> only logical matrix subscripts are allowed in replacement

I'm not sure _I_ would have expected '[<-.data.frame' to recognize  
that a matrix was being offered because the "[.]" formalism  without a  
comma (called "i-indexing" on the help page) would generally be  
referencing only columns (i.e. list elements). I had not realized the  
possibilitiy of offering a logical matrix to df but it does succeed as  
predicted by

?"[.data.frame"

" For replacement, a logical matrix (only) can be used to select the  
elements to be replaced in the same way as for a matrix."

So how you want to characterize documented behavior is your call. I  
would never choose the label you offered.


 > mtest <- matrix(FALSE, 4,4)
 > ix <- cbind(1:2,2:3)
 > dftest <- data.frame(mtest)
 > mtest[ix] <- TRUE
 > dftest[mtest] <- "a"
 > dftest
     X1    X2    X3    X4
1 FALSE     a FALSE FALSE
2 FALSE FALSE     a FALSE
3 FALSE FALSE FALSE FALSE
4 FALSE FALSE FALSE FALSE

The nonassignment operation still succeeds:

 > dftest[ix]
[1] "a" "a"


> Obviously, I was expecting matrix indexing for replacement to work
> similarly in both cases; however, I can see why it would be
> problematic for data frames (mixed types), but was a bit nonplussed by
> the error message, which seems hinky to me.
>
> Cheers,
> Bert
>
> -- 
-- 

David Winsemius, MD
Heritage Laboratories
West Hartford, CT



More information about the R-help mailing list