如何 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
发生了什么事?
- 你想要select行,所以你需要把条件放在逗号左边:
clean_backorder[****,]
- 对于
clean_backorder
的每一行,****
应该是一个 TRUE/FALSE 的向量,它与 date
列上的条件相匹配:clean_backorder[with(clean_backorder, condition on the date column),]
- 您需要转换字符向量“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")))
低于数据集。
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
发生了什么事?
- 你想要select行,所以你需要把条件放在逗号左边:
clean_backorder[****,]
- 对于
clean_backorder
的每一行,****
应该是一个 TRUE/FALSE 的向量,它与date
列上的条件相匹配:clean_backorder[with(clean_backorder, condition on the date column),]
- 您需要转换字符向量“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")))