使用仅包含ISO周的数据集将ISO周聚合到几个月

G. *_*ich 3 r date

我的数据位于数据框中,其结构如下:

df2 <- data.frame(Year = c("2007"), Week = c(1:12), Measurement = c(rnorm(12, mean = 4, sd = 1)))
Run Code Online (Sandbox Code Playgroud)

不幸的是,我没有每个测量的完整日期(例如缺少天数),只有年份和周(这些是ISO周).

现在,我想将一个月的测量值中位数(例如,特定年份的每月每周测量值)汇总到一个新的列"月"中.没有确切的测量日,我没有找到一种方便的方法来做到这一点.任何输入都非常感谢!

djh*_*rio 5

当需要将一周分配到一个月时,可能会应用一年中第一周的规则,尽管ISO 8601不考虑这种情况.(维基百科)

例如,2007年的第5周属于2月,因为第5周的星期四是2月1日.

我正在使用data.tableISOweek打包.请参阅示例如何计算一周中的月份.然后你可以按月进行任何聚合.

require(data.table)
require(ISOweek)

df2 <- data.table(Year = c("2007"), Week = c(1:12),
                  Measurement = c(rnorm(12, mean = 4, sd = 1)))

# Generate Thursday as year, week of the year, day of week according to ISO 8601
df2[, thursday_ISO := paste(Year, sprintf("W%02d", Week), 4, sep = "-")]

# Convert Thursday to date format
df2[, thursday_date := ISOweek2date(thursday_ISO)]

# Compute month
df2[, month := format(thursday_date, "%m")]
df2
Run Code Online (Sandbox Code Playgroud)

Uwe建议计算年月字符串.

# Compute year-month
df2[, yr_mon := format(ISOweek2date(sprintf("%s-W%02d-4", Year, Week)), "%Y-%m")]
df2
Run Code Online (Sandbox Code Playgroud)

最后,您可以对新表进行聚合,或者将中位数添加为列.

df2[, median(Measurement), by = yr_mon]

df2[, median := median(Measurement), by = yr_mon]
df2
Run Code Online (Sandbox Code Playgroud)

  • 伟大的想法采取每周的星期四.这可确保将整周分配给一周中大多数日期所属的月份.但是,为了安全起见,我建议创建一个年月字符串并简化代码,即`yr_mon:= format(ISOweek2date(sprintf("%iW%02i-4",Year,Week))) `. (3认同)
  • 刚注意到你已经省去了聚合部分.所以,一个完整的答案是`library(data.table); setDT(df2)[,median(Measurement),by =.(Yr_Mon = format(ISOweek :: ISOweek2date(sprintf("%sW%02d-4",Year,Week)),"%Y-%m")) ]` (2认同)