Skip to content
Back to formatted view

Raw Message

Message-ID: <1335900488923-4601507.post@n4.nabble.com>
Date: 2012-05-01T19:28:08Z
From: Rui Barradas
Subject: Data frame vs matrix quirk: Hinky error message?
In-Reply-To: <CACk-te3JRjjQWX6_4K9CmwcFPhtCojpQCRm5sRVh0eNcs2--yw@mail.gmail.com>

Hello,


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,
> 
> Cheers,
> Bert
> 
> 
> On Tue, May 1, 2012 at 11:30 AM, Duncan Murdoch
> &lt;murdoch.duncan@&gt; 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&lt;istazahn@&gt; ?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&lt;gunter.berton@&gt;
>>> > ?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@ 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.
>>>
>>>
>>>
>>
> 
> 
> 
> -- 
> 
> 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@ 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.
> 

Actually, it works, as long as the logical index matrix has the same
dimensions as the data frame.


zmat <- matrix(1:12,nr=4)
zdf <- data.frame(zmat)

# Numeric index matrix.
ix <- cbind(1:2,2:3)
# Logical index matrix.
ix2 <- row(zdf) == ix[, 1] & col(zdf) == ix[, 2]

zmat[ix]
zmat[ix2]

zdf[ix]
zdf[ix2]

zmat[ix] <- NA
zmat
# So far so good,
# But now, as already seen, error
zdf[ix] <- NA
# Works
zdf[ix2] <- NA
zdf

It even makes sense...

Rui Barradas


--
View this message in context: http://r.789695.n4.nabble.com/Data-frame-vs-matrix-quirk-Hinky-error-message-tp4601254p4601507.html
Sent from the R help mailing list archive at Nabble.com.