[Rd] vector labels are not permuted properly in a call to sort() (R 2.1)
Martin Maechler
maechler at stat.math.ethz.ch
Wed Oct 5 09:46:01 CEST 2005
>>>>> "AndyL" == Liaw, Andy <andy_liaw at merck.com>
>>>>> on Tue, 4 Oct 2005 13:51:11 -0400 writes:
AndyL> The `problem' is that sort() does not doing anything special when given
AndyL> a matrix: it only treat it as a vector. After sorting, it copies
AndyL> attributes of the original input to the output. Since dimnames are
AndyL> attributes, they get copied as is.
exactly. Thanks Andy.
And I think users would want this (copying of attributes) in
many cases; in particular for user-created attributes
?sort really talks about sorting of vectors and factors;
and it doesn't mention attributes explicitly at all
{which should probably be improved}.
One could wonder if R should keep the dim & dimnames
attributes for arrays and matrices.
S-plus (6.2) simply drops them {returning a bare unnames vector}
and that seems pretty reasonable to me.
At least the user would never make the wrong assumptions that
Greg made about ``matrix sorting''.
AndyL> Try:
>> y <- matrix(8:1, 4, 2, dimnames=list(LETTERS[1:4], NULL))
>> y
AndyL> [,1] [,2]
AndyL> A 8 4
AndyL> B 7 3
AndyL> C 6 2
AndyL> D 5 1
>> sort(y)
AndyL> [,1] [,2]
AndyL> A 1 5
AndyL> B 2 6
AndyL> C 3 7
AndyL> D 4 8
AndyL> Notice the row names stay the same. I'd argue that this is the correct
AndyL> behavior.
AndyL> Andy
>> From: Greg Finak
>>
>> Not sure if this is the correct forum for this,
yes, R-devel is the proper forum.
{also since this is really a proposal for a change in R ...}
>> but I've found what I
>> would consider to be a potentially serious bug to the
>> unsuspecting user.
>> Given a numeric vector V with class labels in R, the following calls
>>
>> 1.
>> > sort(as.matrix(V))
>>
>> and
>>
>> 2.
>> >as.matrix(sort(V))
>>
>> produce different ouput. The vector is sorted properly in
>> both cases,
>> but only 2. produces the correct labeling of the vector. The call to
>> 1. produces a vector with incorrect labels (not sorted).
>>
>> Code:
>> >X<-c("A","B","C","D","E","F","G","H")
>> >Y<-rev(1:8)
>> >names(Y)<-X
>> > Y
>> A B C D E F G H
>> 8 7 6 5 4 3 2 1
>> > sort(as.matrix(Y))
>> [,1]
>> A 1
>> B 2
>> C 3
>> D 4
>> E 5
>> F 6
>> G 7
>> H 8
>> > as.matrix(sort(Y))
>> [,1]
>> H 1
>> G 2
>> F 3
>> E 4
>> D 5
>> C 6
>> B 7
>> A 8
>>
More information about the R-devel
mailing list