我有一個資料框,其中包含幾年的日常觀察。資料集中缺少某些日子:
df <- tibble(time = seq(as.Date("2010/1/1"), as.Date("2020/12/31"), "days"),
value = runif(4018))
# reproducing missing days
df <- df[-sample.int(nrow(df), 100),]
我正在嘗試使用dplyr::group_by年份之間的相同日期范圍對我的資料框進行分組。但是,該范圍從一年開始,到下一年結束,例如,所有時間序列的范圍都在 11 月 15 日到 2 月 15 日之間。我想為每個日期范圍設定一組,例如一組用于 2010-11-15 到 2011-02-15,另一組用于 2011-11-15 到 2012-02-15 等等。
有小費嗎?
uj5u.com熱心網友回復:
一種方法是創建一個單獨的 data.frame,透明地顯示分配的組和日期范圍。然后,您可以使用 data.framefuzzy_inner_join將行分配給組,允許您使用group_by這些組號。要考慮的替代方法是使用data.table,cut和/或findInterval. 讓我知道這是否能滿足您的需求。
library(lubridate)
library(tidyverse)
library(fuzzyjoin)
df_group <- data.frame(
group = seq.int(max(year(df$time)) - min(year(df$time)) 1),
start = seq.Date(as.Date(paste0(min(year(df$time)), "-11-15")), as.Date(paste0(max(year(df$time)), "-11-15")), "years"),
end = seq.Date(as.Date(paste0(min(year(df$time)) 1, "-02-15")), as.Date(paste0(max(year(df$time)) 1, "-11-15")), "years")
)
fuzzy_inner_join(
df,
df_group,
by = c("time" = "start", "time" = "end"),
match_fun = list(`>=`, `<=`)
)
輸出
time value group start end
<date> <dbl> <int> <date> <date>
1 2010-11-15 0.901 1 2010-11-15 2011-02-15
2 2010-11-16 0.991 1 2010-11-15 2011-02-15
3 2010-11-17 0.430 1 2010-11-15 2011-02-15
4 2010-11-18 0.394 1 2010-11-15 2011-02-15
5 2010-11-19 0.142 1 2010-11-15 2011-02-15
6 2010-11-20 0.280 1 2010-11-15 2011-02-15
7 2010-11-21 0.565 1 2010-11-15 2011-02-15
8 2010-11-22 0.935 1 2010-11-15 2011-02-15
9 2010-11-23 0.358 1 2010-11-15 2011-02-15
10 2010-11-24 0.842 1 2010-11-15 2011-02-15
# … with 941 more rows
uj5u.com熱心網友回復:
將所有日期轉換為同一年的日期,并檢查它們是否between在所需的日期范圍內:
library(dplyr)
f <- function(x) paste0("2012-", format(x, "%m-%d"))
df %>%
group_by(bet = between(f(time), as.Date("2012-02-15"), as.Date("2012-11-15")))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/522772.html
標籤:rdplyr润滑
