数据按日期在R中过滤

时间:2015-07-11 06:40:58

标签: r filter

我有这样的数据:

Date             Expiry          Close
2009-05-01       2009-06-26       12
2009-05-01       2009-05-26       22
2009-05-01       2010-05-23       36
2009-05-01       2009-07-26       32
2009-12-01       2009-12-26       33
2009-12-01       2010-01-24       36
2009-12-01       2010-02-26       32

现在我想为那些到期位于 Date Expiry 所在月份的日期过滤数据(按行) Date 的下一个直接月份。如果 Expiry 超出 Date 的下一个月,我想排除它们。

所以我想要所需的数据:

2009-05-01       2009-06-26       12    #Next immediate month  
2009-05-01       2009-05-26       22    #Same Month
2009-12-01       2009-12-26       33    #Same Month
2009-12-01       2010-01-24       36    #Next immediate month

我有POSIXlt格式的日期和到期日期。 请帮忙。我有80000个观察结果。

1 个答案:

答案 0 :(得分:1)

我尝试这样一些可读且相当直接的东西。

首先,清理数据帧:

DF <- data.frame(Date= c('2009-05-01', '2009-05-01', '2009-05-01', '2009-05-01', '2009-12-01', '2009-12-01', '2009-12-01'),
                 Expiry=c('2009-06-26', '2009-05-26','2010-05-23', '2009-07-26', '2009-12-26', '2010-01-24', '2010-02-26'),
                 Close=c(12,22,36,32,33,36,32))

DF$Date <- as.Date(DF$Date)
DF$Expiry <- as.Date(DF$Expiry)

如果你遇到这样的事情:

2000-12-01       2010-02-26

下一行将删除多年来跳跃的情况。

DF <- DF[which( (year(DF$Expiry) - year(DF$Date)>=0) & (year(DF$Expiry) - year(DF$Date)<2) ),]

第一种情况:获取同一年差异为一个月的所有行。

DF1 <- DF[which( (month(DF$Expiry) - month(DF$Date)>=0) & (month(DF$Expiry) - month(DF$Date)<2) & (year(DF$Expiry) == year(DF$Date))),]

下一个案例:获取差异为一个月的所有行,即到期日期和日期十二月之间。这是几个月以来,12 + 1 = 1。

DF2 <- DF[which( (month(DF$Expiry) ==1) & (month(DF$Date)==12) & (year(DF$Expiry) == (year(DF$Date)+1))),]

total <- rbind(DF1, DF2) 

total

应该给你

        Date     Expiry Close
1 2009-05-01 2009-06-26    12
2 2009-05-01 2009-05-26    22
5 2009-12-01 2009-12-26    33
6 2009-12-01 2010-01-24    36

希望这有帮助。