Re: [Rd] [[.data frame and row names

From: Peter Dalgaard <p.dalgaard_at_biostat.ku.dk>
Date: Thu, 12 Jul 2007 10:55:45 +0200

Prof Brian Ripley wrote:
> On Wed, 11 Jul 2007, Herve Pages wrote:
>
>
>> Hi,
>>
>> I'm wondering why indexing a data frame by row name doesn't work
>> with [[. It works with [:
>>
>> > sw <- swiss[1:5,1:2]
>> > sw["Moutier", "Agriculture"]
>> [1] 36.5
>>
>> but not with [[:
>>
>> > sw[["Moutier", "Agriculture"]]
>> Error in .subset2(.subset2(x, ..2), ..1) : subscript out of bounds
>>
>> The problem is really with the row name (and not the col name) since
>> this works:
>>
>> > sw[[4, "Agriculture"]]
>> [1] 36.5
>>
>> but not this:
>>
>> > sw[["Moutier", 2]]
>> Error in .subset2(.subset2(x, ..2), ..1) : subscript out of bounds
>>
>
> .subset2 drops all attributes, including names.
>
>
>> .subset2(sw, "Agriculture")
>>
> [1] 17.0 45.1 39.7 36.5 43.5
>
> This is nothing new: R 2.0.0 did the same, for example.
>
>
That is not quite the issue. The names aren't there to begin with. So more precisely, .subset2 does not *add* row.names(sw) as the names of its result. That, and the fact that sw[[r,c]] is defined to be sw[[c]][[r]].

It is the data frame constructors that drop names on the individual components. Notice that names are getting lost in constructions like this:

 > a <- data.frame(b=c(d=1,e=2),f=c(g=3,h=4))  > dput(a)
structure(list(b = c(1, 2), f = c(3, 4)), .Names = c("b", "f"), row.names = c("d", "e"), class = "data.frame")

Whereas
 > a <- list(b=c(d=1,e=2))
 > .subset2(a,1)
d e
1 2



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Thu 12 Jul 2007 - 09:24:21 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 12 Jul 2007 - 13:36:10 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.