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

Duncan Murdoch murdoch.duncan at gmail.com
Tue May 1 21:24:40 CEST 2012


On 01/05/2012 2:45 PM, Bert Gunter wrote:
> Duncan:
>
> Maybe there **is** a bug, then.
>
>   >  zmat<- matrix(1:12,nr=4)
> >  zdf<- data.frame(zmat)
> >  ix<- cbind(c(FALSE,TRUE),c(TRUE,TRUE))
> >  zmat[ix]
> [1]  2  3  4  6  7  8 10 11 12
> >  zdf[ix]
> [1]  2  3  4  6  7  8 10 11 12
> >  zmat[ix]<- NA
> >  zmat
>       [,1] [,2] [,3]
> [1,]    1    5    9
> [2,]   NA   NA   NA
> [3,]   NA   NA   NA
> [4,]   NA   NA   NA
>
> ## ??
>
> >  zdf[ix]<- NA
> Error in `[<-.data.frame`(`*tmp*`, ix, value = NA) :
>    only logical matrix subscripts are allowed in replacement
>
> That matrix replacement should not work with (in general mixed type)
> data frames seems reasonable, actually. Trying to "fix things" may not
> be. But I leave this to you and your fellow expeRts,

My intention is to allow two column numeric indices, not to change the 
behaviour for logical matrix indices.  I'm planning to leave the "not 
recommended" note in the help page, because there will still be 
surprises as above, but the error message will just say

illegal matrix index in replacement

The rule will remain that a logical matrix needs to be of the same 
dimension as the original dataframe.  I'm not sure if this is documented 
currently, but it will be.

Duncan Murdoch

>
> Cheers,
> Bert
>
>
> On Tue, May 1, 2012 at 11:30 AM, Duncan Murdoch
> <murdoch.duncan at gmail.com>  wrote:
> >  On 01/05/2012 2:12 PM, Bert Gunter wrote:
> >>
> >>  Many thanks, Ista:
> >>
> >>  I only looked in "].default" so the answer is: Alternative 4: dumb
> >>  Bert. Rap knuckles with ruler.
> >>
> >>  Actually, indexing by a logical matrix doesn't make much  sense to me
> >>  in either case, as it does not have the effect of selecting individual
> >>  elements, which is what numeric matrix indices do. But that's a matter
> >>  of usage, neither bug nor feature.
> >>
> >>  If I had gotten something like the error message: "Matrix indices not
> >>  allowed for replacement in data frames," I would not have been
> >>  surprised. But as you said, the behavior **IS** documented.
> >
> >
> >  Your version is not correct:  matrix indices *are* allowed for replacement,
> >  but only logical matrix indices, not two column numerical ones.   The
> >  message might be clearer if instead of saying "only logical matrix
> >  subscripts are allowed in replacement"
> >  it said "matrix subscripts must be logical matrices in replacement", but I
> >  think the basic problem is the limitation.  I'll fix that.
> >
> >  Duncan Murdoch
> >
> >>
> >>  Best,
> >>  Bert
> >>
> >>
> >>
> >>  On Tue, May 1, 2012 at 10:49 AM, Ista Zahn<istazahn at gmail.com>    wrote:
> >>  >    Hi Bert,
> >>  >
> >>  >    The failure itself is the documented behavior: ?'[.data.frame' says
> >>  >
> >>  >    "Matrix indexing ('x[i]' with a logical or a 2-column integer
> >>  >         matrix 'i') using '[' is not recommended, and barely supported.
> >>  >         For extraction, 'x' is first coerced to a matrix.  For
> >>  >         replacement, a logical matrix (only) can be used to select the
> >>  >         elements to be replaced in the same way as for a matrix."
> >>  >
> >>  >    The error message may be a bit hinky, as obviously data.frames can be
> >>  >    indexed by things other than logical matricies. Or is there another
> >>  >    reason this strikes you as odd?
> >>  >
> >>  >    Best,
> >>  >    Ista
> >>  >
> >>  >    On Tue, May 1, 2012 at 1:33 PM, Bert Gunter<gunter.berton at gene.com>
> >>  >    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
> >>  >>
> >>  >>    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
> >>  >>
> >>  >>    --
> >>  >>
> >>  >>    Bert Gunter
> >>  >>    Genentech Nonclinical Biostatistics
> >>  >>
> >>  >>    Internal Contact Info:
> >>  >>    Phone: 467-7374
> >>  >>    Website:
> >>  >>
> >>  >>    http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
> >>  >>
> >>  >>    ______________________________________________
> >>  >>    R-help at r-project.org mailing list
> >>  >>    https://stat.ethz.ch/mailman/listinfo/r-help
> >>  >>    PLEASE do read the posting guide
> >>  >>  http://www.R-project.org/posting-guide.html
> >>  >>    and provide commented, minimal, self-contained, reproducible code.
> >>
> >>
> >>
> >
>
>
>



More information about the R-help mailing list