如何 select 日期范围

How to select a date period

低于数据集。

structure(list(sap_no = c(NA, 1910109125, 1910106937, 1910110360, 
1910110108, 1910107512, 1910108668, 1910108923, 1910110338, 1910110591
), qty = c(2, 1, 2, 1, 5, 1, 2, 1, 2, 2), date = structure(c(18001, 
18001, 18002, 18002, 18002, 18003, 18003, 18009, 18010, 18016
), class = "Date")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

我试过select约会

clean_backorder$date<-as.Date(clean_backorder$date, origin = "1899-12-30")
with(clean_backorder,clean_backorder[date >= "2019-01-01" & date<="2019-12-31"])

它给了我错误

Error in `vectbl_as_col_location()`:
! Must subset columns with a valid subscript vector.
ℹ Logical subscripts must match the size of the indexed input.
x Input has size 3 but subscript `date >= "2019-01-01" & date <= "2019-12-31"` has size 1525.

请问我该如何解决这个问题? 顺便说一句,当我 运行 对数据框执行 head 函数时,日期列似乎是日期格式?

> head(clean_backorder$date,10)
 [1] "2019-04-15" "2019-04-15" "2019-04-16" "2019-04-16" "2019-04-16" "2019-04-17" "2019-04-17" "2019-04-23"
 [9] "2019-04-24" "2019-04-30"

关于如何告诉 R 列日期中符合条件的 select 行,您有一些代码问题。 这是一个基本的方式:

clean_backorder[with(clean_backorder, date >= as.Date("2019-01-01") & date <= as.Date("2019-12-31")),]

输出:

# A tibble: 10 x 3
       sap_no   qty date      
        <dbl> <dbl> <date>    
 1         NA     2 2019-04-15
 2 1910109125     1 2019-04-15
 3 1910106937     2 2019-04-16
 4 1910110360     1 2019-04-16
 5 1910110108     5 2019-04-16
 6 1910107512     1 2019-04-17
 7 1910108668     2 2019-04-17
 8 1910108923     1 2019-04-23
 9 1910110338     2 2019-04-24
10 1910110591     2 2019-04-30

发生了什么事?

  1. 你想要select行,所以你需要把条件放在逗号左边:clean_backorder[****,]
  2. 对于 clean_backorder 的每一行,**** 应该是一个 TRUE/FALSE 的向量,它与 date 列上的条件相匹配:clean_backorder[with(clean_backorder, condition on the date column),]
  3. 您需要转换字符向量“2019-01-01”,。使用 as.Date() 转换为 Date 格式,以便您可以过滤 Date 列:clean_backorder[with(clean_backorder, date >= as.Date("2019-01-01") & date <= as.Date("2019-12-31")),]

正如评论中所建议的那样,tidyverse 包提供了有用的函数来使这段代码更易读:

clean_backorder |> # or %>% if you prefer to use magrittr pipe 
  dplyr::filter(date >= as.Date("2019-01-01") & date <= as.Date("2019-12-31"))

clean_backorder |> # or %>% if you prefer to use magrittr pipe 
  dplyr::filter(dplyr::between(date, as.Date("2019-01-01"), as.Date("2019-12-31")))