如何在 R 中创建一个特定的星期变量?

How to create a specific week variable in R?

我有一个带有 POSIXct 格式的日期时间列的数据框。我知道我可以在 lubridate 中使用 week() 函数来获取每个日期时间发生的一年中的特定星期。例如,2018-01-09 是一年中的第 2 周。但是,我想要做的是根据第一个事件的时间创建一个单独的周列。因此,给定年份中第一个记录的时间戳是第一周的第一天,下一周的开始是 7 天后,一直持续到最后一个记录的时间戳。

这是时间戳的示例数据框。

structure(list(DateTime = structure(c(1530966465, 1530476296, 
1532068672, 1530184126, 1531553917, 1533584592, 1533598716, 1534290590, 
1530660196, 1531019505, 1531929952, 1531220568, 1531464927, 1531253187, 
1533907581, 1531382467, 1531049364, 1534275102, 1533242173, 1530437391, 
1531821904, 1531511295, 1530394204, 1530622501, 1532076187, 1530628179, 
1532316349, 1531100712, 1534414604, 1533893637), class = c("POSIXct", 
"POSIXt"), tzone = "EST")), row.names = c(527906L, 577471L, 537361L, 
501302L, 438775L, 208959L, 623171L, 264669L, 483416L, 416530L, 
506487L, 565627L, 603002L, 557837L, 257743L, 452464L, 498886L, 
59601L, 52207L, 551750L, 541328L, 416508L, 564241L, 599176L, 
446559L, 564590L, 538353L, 402453L, 606952L, 12402L), class = "data.frame")

您可以 arrange 基于 DateTime 的数据,得到它的 week 数量,然后从第一个值中减去周值。

library(dplyr)
library(lubridate)

df %>%
  arrange(DateTime) %>%
  mutate(week = week(DateTime), week = week - first(week) + 1)

在不整理数据的情况下,我们可以从 min 周值中减去。

df %>% mutate(week = week(DateTime), week = week - min(week) + 1)

使用 base R,可以这样做:

df$week <- as.integer(format(df$DateTime, "%V"))
transform(df, week = week - min(week) + 1)

我们可以用 data.table

library(data.table)
library(lubridate)
setDT(df)[order(DateTime), week := week(DateTime) - first(week(DateTime)) + 1]