R: Subsetting a data frame using a list of dates as the filter

Viewed 48054

I have a data frame with a date column and some other value columns. I would like to extract from the data frame those rows in which the date column matches any of the elements in a pre-existing list of dates. For example, using a list of one element, the date '2012-01-01' would pull the row with a date of '2012-01-01' from the data frame.

For numbers I think I know how to match the values. This code:

testdf <- data.frame(mydate = seq(as.Date('2012-01-01'), 
                                  as.Date('2012-01-10'), by = 'day'),
                     col1 = 1:10,
                     col2 = 11:20,
                     col3 = 21:30)

...produces this data frame:

       mydate col1 col2 col3
1  2012-01-01    1   11   21
2  2012-01-02    2   12   22
3  2012-01-03    3   13   23
4  2012-01-04    4   14   24
5  2012-01-05    5   15   25
6  2012-01-06    6   16   26
7  2012-01-07    7   17   27
8  2012-01-08    8   18   28
9  2012-01-09    9   19   29
10 2012-01-10   10   20   30

I can do this:

testdf[which(testdf$col3 %in% c('25','29')),]

which produces this:

      mydate col1 col2 col3
5 2012-01-05    5   15   25
9 2012-01-09    9   19   29

I can generalise this to a list like this:

myvalues <- c('25','29')
testdf[which(testdf$col3 %in% myvalues),]

And I get the same output. So I had thought I would be able to use the same approach for dates, but it appears that I was wrong. Doing this:

testdf[which(testdf$mydate %in% c('2012-01-05','2012-01-09')),]

Gets me this:

[1] mydate col1   col2   col3  
<0 rows> (or 0-length row.names)

And popping the dates in their own list - which is the ultimate aim - doesn't help either. I can think of ways round this with loops or an apply function, but it seems to me that there must be a simpler way for what is probably a fairly common requirement. Is it that I have again overlooked something simple?

Q: How can I subset those rows of a data frame that have a date column the values of which match one of a list of dates?

3 Answers
Related