我有一個資料框如下:
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)
)
關于如何以這種方式過濾的任何想法?謝謝!
uj5u.com熱心網友回復:
首先,看起來日期的東西應該是真正的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
uj5u.com熱心網友回復:
這是一個基本的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
uj5u.com熱心網友回復:
我們可以用 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
uj5u.com熱心網友回復:
這是使用輔助函式的另一個選項,該函式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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/314590.html
