Подтвердить что ты не робот

Фильтр dplyr по дате

my tbl_df:

    > p2p_dt_SKILL_A%>%
    + select(Patch,Date,Prod_DL)%>%
    + head()
      Patch       Date Prod_DL
    1  BVG1 2015-09-04    3.43
    2 BVG11 2015-09-11    3.49
    3 BVG12 2015-09-18    3.45
...
    4 BVG13 2015-12-06    3.57
    5 BVG14 2015-12-13    3.43
    6 BVG15 2015-12-20    3.47

Я хочу выбрать все rows в зависимости от даты, например, если Date больше, чем 2015-09-04 и меньше 2015-09-18

Результат должен быть:

      Patch       Date          Prod_DL
      BVG1        2015-09-04    3.43
      BVG11       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)

Но это дает мне целые сентябрьские данные.

Существует ли более эффективный способ использования оператора between из dplyr в Date переменных типов

4b9b3361

Ответ 1

Если Дата правильно отформатирована как date, ваша первая попытка работает:

p2p_dt_SKILL_A <-read.table(text="Patch,Date,Prod_DL
BVG1,9/4/2015,3.43
BVG11,9/11/2015,3.49
BVG12,9/18/2015,3.45
BVG13,12/6/2015,3.57
BVG14,12/13/2015,3.43
BVG15,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 BVG11 2015-09-11    3.49

UPDATE

Все еще работает, если данные имеют тип 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 BVG11 2015-09-11    3.49

Ответ 2

Другим более подробным вариантом будет использование функции 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")))