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@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel