我有一个数据框架如下:
B = data.frame(
week = c("2021-08-09", "2021-11-11", "2017-06-18", "2020-09-07", "2020-09-07", "2020-09-07", "2020-09-12",
"2020-08-23", "2019-12-22", "2017-10-29"),
store = c(14071, 11468, 2428, 17777, 14821, 10935, 5127, 14772, 14772, 14772),
fill = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
)
我试图按最近两年内的日期进行过滤,因此在本例中为2021和2020。然而,我并没有试图明确地硬编码2021年和2020年,因为当这些数据得到刷新时,它将进入2022年等等。例如,如果最近的两年是2023年和2022年,那么我想保留所有的"周"。包含这些年份的日期值。从本质上讲,我的目标是从今年(也就是2年的数据)获得一年前的数据。根据上面的例子,我想要得到的输出是:
B = data.frame(
week = c("2021-08-09", "2021-11-11", "2020-09-07", "2020-09-07", "2020-09-07", "2020-09-12", "2020-08-23"),
store = c(14071, 11468, 17777, 14821, 10935, 5127, 14772),
fill = c(1, 1, 1, 1, 1, 1, 1)
)
有什么办法可以这样过滤吗?谢谢!
首先,看起来像日期的东西应该是真正的Date
类对象,所以我将从
B$week <- as.Date(B$week)
(不是严格要求,但无论如何都可能是一件好事。)
从这里
oneyearago <- with(list(r = as.POSIXlt(max(B$week))), { r$year <- r$year - 1; r; })
twoyears <- as.Date(format(oneyearago, format = "%Y-01-01"))
B[B$week >= twoyears,]
# week store fill
# 1 2021-08-09 14071 1
# 2 2021-11-11 11468 1
# 4 2020-09-07 17777 1
# 5 2020-09-07 14821 1
# 6 2020-09-07 10935 1
# 7 2020-09-12 5127 1
# 8 2020-08-23 14772 1
这是一个基本的R方式。
首先,将week
强制到"Date"
类。
B$week <- as.Date(B$week)
现在,用format
获得年份向量,然后用tail
排序并保留最后两个,最后,过滤data.frame.
yr <- as.integer(format(B$week, "%Y"))
last_2 <- tail(sort(unique(yr)), n = 2)
B[yr >= min(last_2), ]
# week store fill
#1 2021-08-09 14071 1
#2 2021-11-11 11468 1
#3 2020-09-07 17777 1
#4 2020-09-07 14821 1
#5 2020-09-07 10935 1
#6 2020-09-12 5127 1
#7 2020-08-23 14772 1
我们可以使用tidyverse
library(dplyr)
library(lubridate)
B %>%
mutate(year = year(ymd(week))) %>%
arrange(desc(year)) %>%
filter(year >= min(head(unique(year), 2))) %>%
select(-year)
与产出
week store fill
1 2021-08-09 14071 1
2 2021-11-11 11468 1
3 2020-09-07 17777 1
4 2020-09-07 14821 1
5 2020-09-07 10935 1
6 2020-09-12 5127 1
7 2020-08-23 14772 1
这是使用辅助函数get_year
的另一个选项,它返回日期的年份值。
get_year <- function(date) as.numeric(sub('-.*', '', date))
subset(B, get_year(week) %in% (get_year(Sys.Date()) - 0:1))
# week store fill
#1 2021-08-09 14071 1
#2 2021-11-11 11468 1
#4 2020-09-07 17777 1
#5 2020-09-07 14821 1
#6 2020-09-07 10935 1
#7 2020-09-12 5127 1
#8 2020-08-23 14772 1