Re: [Rd] PR#6614

From: Bill Dunlap <>
Date: Mon 27 Feb 2006 - 17:57:57 GMT

On Wed, 23 Feb 2006, Peter Dalgaard wrote:

> "Gabor Grothendieck" <> writes:
> > Try this:
> >
> > subset(iris, select = - Species)
> Or, canonically,
> nm <- names(iris)
> iris[, nm != "Species" ]
> iris[, -match("Species", nm)]
> >
> > On 2/22/06, <> wrote:
> > > I agree with the submitter that this needs some kind of solution.
> > > Although data.frame[,-12] works, how do I drop a named column (the
> > > most common use case)? (I found this bug while searching for an
> > > answer.)

That code with match only works if "Species" is actually a column of iris. If not, your result depends on whether you have a data.frame (an error) or a matrix (a column of NA's).

I found some mail in a 15 year old sent-mail file that suggested allowing the tag 'except=' on any of the arguments to "[" to replace/extend the limited negative integer convention. The idea was that

    iris[ except=c(10:20), except=c("Petal.Width","Petal.Length")) ] would return all rows except 10:20 and all columns except the ones named.

    iris[ except=integer(0), ]
would return all rows of iris, while iris[-integer(0), ] returns no rows of iris.

This abuses the tag= notation, but the "[" function doesn't really support the i= and j= tags that some people expect.

This would take care of the problem that subset(data.frame,select=-name) only lets you omit columns.

The mail had a version of [.data.frame (for Splus 2.1?) that implemented this, although, if it is to be used it should be implemented in the most primitive [ code so all methods use it.

Bill Dunlap
Insightful Corporation
bill at insightful dot com

 "All statements in this message represent the opinions of the author and do  not necessarily reflect Insightful Corporation policy or position." mailing list Received on Tue Feb 28 05:11:25 2006

This archive was generated by hypermail 2.1.8 : Mon 27 Feb 2006 - 22:16:07 GMT