[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