Data frame vs matrix quirk: Hinky error message?
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