我有一個像這樣的資料集
data <- data.table::data.table(id = seq(1:5),
t0_year = c(2000,2001,2002,2001,2000),
t0_week = c(4,32,44,15,11),
t1_date = as.Date(c("2010-07-31", "2010-12-31", "2010-02-08", "2005-07-05", "2000-07-20")))
我想計算 t1 和 t0 之間以周為單位的時差,但是對于 t0,我只有年份和周數,而對于 t1,我有確切的日期。
我嘗試了不同的東西lubridate,但運氣不佳。有沒有人有辦法解決嗎?
uj5u.com熱心網友回復:
人們無法計算日期和星期之間固定單位的差異,它們是不同的。最好的方法是確定一個范圍,其中的差值可能是一個數字正負 3.5,以表明您不知道哪個值是正確的。如果假設您的“一周”從星期日或星期一或您選擇的任何一天開始,那么...更改t0為 a Date(永久地,作為新列,或即時)并使用-或difftime。
作為一個粗略的例子,2021-10-19和之間(確切地說)有什么區別2021-Jan?我已將其概括為一個月而不是一周,但重點是相同的。該值介于 261?? 和 291(含)之間,根據我們所知,它可能是具有相等概率的任何值。如果我們假設某人最有可能想要與所述月份的第一天或最后一天不同,那么它是 261 或 291 中的一個,但要知道哪個我們需要知道原始問題的意圖和/或背景關系。
有關“如何將年月轉換為Date物件”的討論,請參閱將年/周轉換為日期物件。
這里有兩個選項,具體取決于基于周日還是周一的周。(我選擇這兩天是因為那些似乎是最頻繁的一周開始日;但是,無論您使用哪一個取決于您和背景關系或您的資料,我不斷言這些天比其他天好。)
library(data.table)
data[, t0_sun := as.Date(sprintf("%4ii7", t0_year, t0_week), format = "%Y%U%u")
][, t0_mon := as.Date(sprintf("%4ii1", t0_year, t0_week), format = "%Y%U%u")
][, d := as.numeric(t1_date - t0_sun, "weeks")]
# id t0_year t0_week t1_date t0_mon t0_sun d
# <int> <num> <num> <Date> <Date> <Date> <num>
# 1: 1 2000 4 2010-07-31 2000-01-24 2000-01-23 548.85714
# 2: 2 2001 32 2010-12-31 2001-08-13 2001-08-12 489.71429
# 3: 3 2002 44 2010-02-08 2002-11-04 2002-11-03 379.14286
# 4: 4 2001 15 2005-07-05 2001-04-16 2001-04-15 220.28571
# 5: 5 2000 11 2000-07-20 2000-03-13 2000-03-12 18.57143
(我計算了兩個t0_sun,t0_mon只是為了演示星期日和星期一的計算,注意附加到字串的不同數字。你只需要一個。)
請注意,來自?strptime(以及有關年周至的鏈接問題/答案Date)"%U"使用的是基于美國的標準;人們可能會選擇"%W"以英國為基地的周。
data[, t0_sun := as.Date(sprintf("%4ii0", t0_year, t0_week), format = "%Y%W%w")
][, t0_mon := as.Date(sprintf("%4ii1", t0_year, t0_week), format = "%Y%W%2")
][, d := as.numeric(t1_date - t0_sun, "weeks")]
uj5u.com熱心網友回復:
這是否有效:
library(dplyr)
library(lubridate)
data %>% mutate(t0_date = as.Date(paste(t0_year, round(day(weeks(t0_week))/30), '01', sep = '-'), format = '%Y-%m-%d'), diff_weeks = difftime(t1_date,t0_date, units = 'weeks'))
id t0_year t0_week t1_date t0_date diff_weeks
1: 1 2000 4 2010-07-31 2000-01-01 552.00000 weeks
2: 2 2001 32 2010-12-31 2001-07-01 495.71429 weeks
3: 3 2002 44 2010-02-08 2002-10-01 383.85714 weeks
4: 4 2001 15 2005-07-05 2001-04-01 222.28571 weeks
5: 5 2000 11 2000-07-20 2000-03-01 20.14286 weeks
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/324559.html
上一篇:在模式后洗掉部分字串
