我的数据位于数据框中,其结构如下:
df2 <- data.frame(Year = c("2007"), Week = c(1:12), Measurement = c(rnorm(12, mean = 4, sd = 1)))
不幸的是,我没有每个测量的完整日期(例如缺少天数),只有年和周(这些是ISO周)。
现在,我想将一个月的测量值中位数(例如特定年份的每月每周测量值)汇总到一个新的列“月”中。没有确切的测量日,我没有找到一种方便的方法来做到这一点。任何投入都非常感谢!
答案 0 :(得分:5)
当需要将一周分配到一个月时,可能会应用一年中第一周的规则,尽管ISO 8601不考虑这种情况。(Wikipedia )
例如,2007年的第5周属于2月,因为第5周的星期四是2月1日。
我正在使用data.table
和ISOweek
个套餐。请参阅示例如何计算一周中的月份。然后你可以按月进行任何聚合。
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周? 然后,您只需按月变量分组并计算中位数。非常简单
希望这有帮助