Как создать указанную переменную c недели в R? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть фрейм данных со столбцом даты и времени в формате POSIXct. Мне известно, что я могу использовать функцию week() в lubridate, чтобы получить указанную c неделю года, в которую происходит каждая дата-время. Например, 2018-01-09 - на неделе 2 года. Тем не менее, я пытаюсь создать отдельный столбец недели, основанный на времени первого события. Таким образом, первая записанная метка времени в данном году - это день с первой недели, начало следующей недели - через семь дней, и это продолжается до последней записанной метки времени.

Вот пример данных с метками времени .

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")

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Вы можете 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)

Используя базу R, это можно сделать как:

df$week <- as.integer(format(df$DateTime, "%V"))
transform(df, week = week - min(week) + 1)
0 голосов
/ 21 апреля 2020

Мы могли бы сделать это с data.table

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