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

时间:2017-09-20 10:05:37

标签: r date

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

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

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

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

4 个答案:

答案 0 :(得分:5)

当需要将一周分配到一个月时,可能会应用一年中第一周的规则,尽管ISO 8601不考虑这种情况。Wikipedia

例如,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

Uwe建议计算年月字符串。

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

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

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

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

答案 1 :(得分:2)

如果我理解正确,你不知道确切的一天,但只知道周数和年份。我的答案以一年中的第一天作为开始日期,然后根据它来计算一周的间隔。你可以改进答案。

基于 an answer by mnel,使用lubridate package

library(lubridate)

# Prepare week, month, year information ready for the merge
# Make sure you have all the necessary dates
wmy <- data.frame(Day = seq(ymd('2007-01-01'),ymd('2007-04-01'), 
                            by = 'weeks')) 
wmy <- transform(wmy, 
                 Week = isoweek(Day),
                 Month = month(Day),
                 Year = isoyear(Day))

# Merge this information with your data
merge(df2, wmy, by = c("Year", "Week"))

   Year Week Measurement        Day Month
1  2007    1    3.704887 2007-01-01     1
2  2007   10    1.974533 2007-03-05     3
3  2007   11    4.797286 2007-03-12     3
4  2007   12    4.291169 2007-03-19     3
5  2007    2    4.305010 2007-01-08     1
6  2007    3    3.374982 2007-01-15     1
7  2007    4    3.600008 2007-01-22     1
8  2007    5    4.315184 2007-01-29     1
9  2007    6    4.887142 2007-02-05     2
10 2007    7    4.155411 2007-02-12     2
11 2007    8    4.711943 2007-02-19     2
12 2007    9    2.465862 2007-02-26     2

答案 2 :(得分:1)

使用dplyr您可以尝试:

require(dplyr)

df2 %>% mutate(Date = as.Date(paste("1", Week, Year, sep = "-"), format = "%w-%W-%Y"),
            Year_Mon = format(Date,"%Y-%m")) %>% group_by(Year_Mon) %>%
            summarise(result = median(Measurement))

正如@djhrio所指出的那样,星期四被用来确定一个月内的星期几。因此,只需在上面的代码中将paste("1",切换为paste("4",

答案 3 :(得分:0)

这可以在dplyr中相对简单地完成。

library(dplyr)

df2 %>% 
  mutate(Month = rep(1:3, each = 4)) %>% 
  group_by(Month) %>% 
  summarise(MonthlyMedian = stats::median(Measurement))

基本上,添加一个新列来定义您的月份。我假设你没有几天,你将每月分配4周? 然后,您只需按月变量分组并计算中位数。非常简单

希望这有帮助