我有一个数据框,每年都有每日观察结果。我想过滤到一个范围,例如" 3月10日到5月12日"每年。也许这是我糟糕的谷歌搜索技巧,但我无法找到某种日月建设。
这是一个样本df:
set.seed(123)
dates <- seq.Date(from=as.Date("1970-01-01"), to=as.Date("2007-08-31"), by="days")
sample.df <- data.frame(date=dates,
data=rnorm(length(dates)))
另一个复杂的补充是保持一个跨越多年的范围,例如&#34; 12月10日到2月2日。&#34;可以假设所有需要的日期都包含在数据框中,但可能需要制作一些NA,例如数据框到2007年时,所以我们不能做到2007年12月10日到2008年2月2日。
答案 0 :(得分:2)
这适用于任意年份和任意复杂的逻辑条件。没有包使用。
monthday <- format(sample.df$date, "%m%d")
sample.df[ monthday >= "0310" & monthday <= "0512", ] # mar 10 - may 12
sample.df[ monthday <= "0202" | monthday >= "1210", ] # dec 10 - feb 02
sample.df[ monthday <= "0202" |
(monthday >= "0310" & monthday <= "0512") |
monthday >= "1210", ] # both
答案 1 :(得分:1)
您可以使用dplyr
和lubridate
:
library(dplyr)
library(lubridate)
sample.df %>% filter(between(date, ymd("2006-03-10"), ymd("2006-05-12")))
sample.df %>% filter(between(date, ymd("2006-10-11"), ymd("2007-02-01")))
忽略年份:
sample.df %>%
mutate(dummy = (month(date)*100) + day(date)) %>%
filter(between(dummy,310,512)) %>%
select(-dummy)