tags:

views:

295

answers:

2

I have a data frame with about 40 columns, the second column, data[2] contains the name of the company that the rest of the row data describes. However, the names of the companies are different depending on the year (trailing 09 for 2009 data, nothing for 2010).

I would like to be able to subset the data such that I can pull in both years at once. Here is an example of what I'm trying to do...

subset(data, data[2] == "Company Name 09" | "Company Name", drop = T) 

Essentially, I'm having difficulty using the OR operator within the subset function.

However, I have tried other alternatives:

subset(data, data[[2]] == grep("Company Name", data[[2]]))

Perhaps there's an easier way to do it using a string function?

Any thoughts would be appreicated.

+3  A: 

A couple of things:

1) Mock-up data is useful as we don't know exactly what you're faced with. Please supply data if possible. Maybe I misunderstood in what follows?

2) Don't use [[2]] to index your data.frame, I think [,"colname"] is much clearer

3) If the only difference is a trailing ' 09' in the name, then simply regexp that out:

R> x1 <- c("foo 09", "bar", "bar 09", "foo")
R> x2 <- gsub(" 09$", "", x1)
[1] "foo" "bar" "bar" "foo"
R> 

Now you should be able to do your subset on the on-the-fly transformed data:

R> data <- data.frame(value=1:4, name=x1)
R> subset(data, gsub(" 09$", "", name)=="foo")
  value   name
1     1 foo 09
4     4    foo
R> 

You could also have replace the name column with regexp'ed value.

Dirk Eddelbuettel
Jonathan gave me the answer that I was looking for in a comment above. But your post solves another similar problem I was having. Thanks Dirk.
Brandon Bertelsen
My pleasure -- glad it helped.
Dirk Eddelbuettel
+4  A: 

First of all (as Jonathan done in his comment) to reference second column you should use either data[[2]] or data[,2]. But if you are using subset you could use column name: subset(data, CompanyName == ...).

And for you question I will do one of:

subset(data, data[[2]] %in% c("Company Name 09", "Company Name"), drop = TRUE) 
subset(data, grepl("^Company Name", data[[2]]), drop = TRUE)

In second I use grepl (introduced with R version 2.9) which return logical vector with TRUE for match.

Marek
Thanks Marek, the second solution is much cleaner and simplifies the code. grepl isn't in my docs when I search ??string.
Brandon Bertelsen