在r中选择多年的日期范围

时间:2016-06-30 05:41:26

标签: r

我有一个包含大约4。5年数据的数据集。我正在尝试从中创建两个不同的数据框,我称之为假日和非假日期间。每年有多个时段,这些时段将重复多年。

例如,我想选择感恩节和元旦之间的时间段,以及每年情人节和母亲节之前的时段,并将其作为假期数据框。其他一切都不是假期。

如果之前有人问过我道歉,我就是找不到它。我发现了一个类似于SQL的问题,但我想弄清楚如何在R中做到这一点。

我尝试过滤和选择,但无济于事。

arr[i]

显然有些事情是不对的,因为它不仅限制了日期范围,而且还包括我甚至不选择的数据框中的一列。

2 个答案:

答案 0 :(得分:0)

正如评论中所述,dplyr使用filter而非subset。只需对您所拥有的代码进行简单的更改(因此不是问题的完整解决方案,但希望有所帮助),应该让子集正常工作。

wine.holiday <- wine.sub2 %>% 
   select(total, cdate)
wine.holiday <- subset(wine.holiday, cdate>=as.Date("2011-11-25") & cdate<=as.Date("2011-12-31"))
wine.holiday

或者,坚持使用dplyr管道:

wine.holiday <- wine.sub2 %>% 
    select(total, cdate) %>%
    filter( cdate>=as.Date("2011-11-25") & cdate<=as.Date("2011-12-31") )
wine.holiday

编辑添加:如果dplyr选择不起作用(对我来说看起来不错),你可以试试这个:

wine.holiday <- subset( wine.sub2, select = c( total, cdate ) )
wine.holiday <- subset(wine.holiday, cdate>=as.Date("2011-11-25") & cdate<=as.Date("2011-12-31"))
wine.holiday

当然,您可以将这两行合并为一条。这使得阅读更加困难,但可能会提高处理效率:

wine.holiday <- subset(wine.sub2, cdate>=as.Date("2011-11-25") & cdate<=as.Date("2011-12-31"), select=c(total,cdate) )

答案 1 :(得分:0)

我通过查看SO帖子(花了一段时间)找到了另一种方法。

> library(dateTime)
> wine.holiday <- data.table(start = c(as.Date(USThanksgivingDay(2010:2020))), 
+                            end = as.Date(USNewYearsDay(2011:2021))-1)
> wine.holiday
         start        end
 1: 2010-11-25 2010-12-31
 2: 2011-11-24 2011-12-31
 3: 2012-11-22 2012-12-31
 4: 2013-11-28 2013-12-31
 5: 2014-11-27 2014-12-31
 6: 2015-11-26 2015-12-31
 7: 2016-11-24 2016-12-31
 8: 2017-11-23 2017-12-31
 9: 2018-11-22 2018-12-31
10: 2019-11-28 2019-12-31
11: 2020-11-26 2020-12-31

我仍然需要弄清楚如何添加其他范围(例如情人节前一天或母亲节前两周),如果/当我弄清楚时,我会更新这个答案。< / p>