在dplyr中筛选日期

42

我的 tbl_df:

    > p2p_dt_SKILL_A%>%
    + select(Patch,Date,Prod_DL)%>%
    + head()
      Patch       Date Prod_DL
    1  P1 2015-09-04    3.43
    2 P11 2015-09-11    3.49
    3 P12 2015-09-18    3.45
...
    4 P13 2015-12-06    3.57
    5 P14 2015-12-13    3.43
    6 P15 2015-12-20    3.47

我想根据日期选择所有行,例如如果Date大于2015-09-04且小于2015-09-18

结果应为:

      Patch       Date          Prod_DL
      P1        2015-09-04    3.43
      P11       2015-09-11    3.49

我尝试了以下方法,但返回了一个空的向量。

p2p_dt_SKILL_A%>%
                select(Patch,Date,Prod_DL)%>%
                filter(Date > "2015-09-04" & Date <"2015-09-18")

只返回:

> p2p_dt_SKILL_A%>%
+                 select(Patch,Date,Prod_DL)%>%
+                 filter(Date > 2015-09-12 & Date <2015-09-18)
Source: local data table [0 x 3]

Variables not shown: Patch (fctr), Date (date), Prod_DL (dbl)

也尝试使用引号。

并且使用 lubridate

p2p_dt_SKILL_A%>%
                select(Patch,Date,Prod_DL)%>%
                #filter(Date > 2015-09-12 & Date <2015-09-18)%>%
                filter(Patch %in% c("BVG1"),month(p2p_dt_SKILL_A$Date) == 9)%>%
                arrange(Date)

但这给了我整个9月份的数据。

是否有更有效的方法,例如在dplyr中使用Date类型变量上的between运算符?


1
你能在你的问题中添加str(p2p_dt_SKILL_A)吗?我想看看日期是一个date对象还是其他什么东西。 - Pierre Lapointe
@PLapointe,它已经在返回部分中了。变量未显示:Patch(fctr),Date(date),Prod_DL(dbl)... 它是一个日期类型。 - Shery
代码中那部分日期没有用引号(")括起来。使用你在上面的代码,它可以工作。请看下面我的答案。 - Pierre Lapointe
@PLapointe 尝试过使用引号和不使用引号...都不行...我的数据框是 tbl_df 类型。 - Shery
这个回答解决了你的问题吗?在两个日期之间对数据框进行子集操作 - camille
2个回答

45

如果日期格式正确,按照 日期 的方式进行格式化,你的第一次尝试就可以成功:


p2p_dt_SKILL_A <-read.table(text="Patch,Date,Prod_DL
P1,9/4/2015,3.43
P11,9/11/2015,3.49
P12,9/18/2015,3.45
P13,12/6/2015,3.57
P14,12/13/2015,3.43
P15,12/20/2015,3.47
",sep=",",stringsAsFactors =FALSE, header=TRUE)

p2p_dt_SKILL_A$Date <-as.Date(p2p_dt_SKILL_A$Date,"%m/%d/%Y")

p2p_dt_SKILL_A%>%
                select(Patch,Date,Prod_DL)%>%
                filter(Date > "2015-09-04" & Date <"2015-09-18")
  Patch       Date Prod_DL
1 P11 2015-09-11    3.49

如果数据类型为tbl_df,仍然可用。

p2p_dt_SKILL_A <-tbl_df(p2p_dt_SKILL_A)

p2p_dt_SKILL_A%>%
                select(Patch,Date,Prod_DL)%>%
                filter(Date > "2015-09-04" & Date <"2015-09-18")
Source: local data frame [1 x 3]

  Patch       Date Prod_DL
  (chr)     (date)   (dbl)
1 P11 2015-09-11    3.49

19

另一个更冗长的选项是使用函数between它是x > = left&x <= right的快捷方式。我们需要改变日期以考虑=符号,并使用as.Date(解释在此处)。

p2p_dt_SKILL_A%>%
                select(Patch,Date,Prod_DL)%>%
                filter(between(Date, as.Date("2015-09-05"),as.Date("2015-09-17")))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接