如何从最近的r年筛选到一年前



我有一个数据框架如下:

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

相关内容

  • 没有找到相关文章

最新更新