Объедините недели ISO в месяцы с набором данных, содержащим только недели ISO
Мои данные находятся в кадре данных, который имеет такую структуру:
df2 <- data.frame(Year = c("2007"), Week = c(1:12), Measurement = c(rnorm(12, mean = 4, sd = 1)))
К сожалению, у меня нет полной даты (например, отсутствуют дни) для каждого измерения, только Год и Недели (это недели ISO).
Теперь я хочу объединить медиану измерения за месяц (например, еженедельные измерения за месяц конкретного года) в новый столбец Месяцы. Я не нашел удобного способа сделать это, не имея точного дня доступных измерений. Любые вклады очень ценятся!
4 ответа
Когда необходимо выделить неделю на один месяц, может быть применено правило для первой недели года, хотя ISO 8601 не рассматривает этот случай. ( Википедия)
Например, 5-я неделя 2007 года относится к февралю, потому что четверг 5-й недели был 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
Предложение Уве вычислить строку год-месяц.
# 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
Если я правильно понимаю, вы не знаете точный день, а только номер недели и год. В моем ответе в качестве даты начала принимается первый день года, а затем на основании этого вычисляются интервалы в одну неделю. Вы, вероятно, можете уточнить ответ.
Основано на ответе mnel с использованием пакета lubridate.
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
С помощью 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",
в коде выше.
Это можно сделать относительно просто в dplyr.
library(dplyr)
df2 %>%
mutate(Month = rep(1:3, each = 4)) %>%
group_by(Month) %>%
summarise(MonthlyMedian = stats::median(Measurement))
По сути, добавьте новый столбец, чтобы определить ваши месяцы. Я полагаю, так как у вас нет дней, вы собираетесь выделять 4 недели в месяц? Затем вы просто группируете по своей переменной Month и вычисляете медиану. Очень просто
Надеюсь это поможет