Объедините недели 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 и вычисляете медиану. Очень просто

Надеюсь это поможет

Другие вопросы по тегам