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?
You have to convert the date
stringinto aDatevariable usingas.Date(try?as.Dateat the console). Bonus: you can drop which: