@ Uwe, пример содержал 12 недель, и не было никаких признаков того, что он вышел за пределы одного года, следовательно, супер упрощение

анные находятся в кадре данных, который имеет такую ​​структуру:

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

К сожалению, у меня нет полной даты (например, пропущены дни) для каждого измерения, только год и недели (это недели ISO).

Теперь я хочу объединить значение измерений Медиана за месяц (например, еженедельные измерения за месяц конкретного года) в новый столбец Месяцы. Я не нашел удобного способа сделать это, не имея точного дня доступных измерений. Любые вклады очень ценятся!

Ответы на вопрос(1)

Решение Вопроса

Когда необходимо выделить неделю на один месяц, может быть применено правило для первой недели года, хотя 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
 Uwe20 сент. 2017 г., 16:33
Просто заметил, что вы сэкономили часть агрегации. Итак, полный ответ будетlibrary(data.table); setDT(df2)[, median(Measurement), by = .(Yr_Mon = format(ISOweek::ISOweek2date(sprintf("%s-W%02d-4", Year, Week)), "%Y-%m"))]
 djhurio20 сент. 2017 г., 16:48
@ Спасибо, спасибо! Просто заметил, что вы являетесь авторомISOweek, Большое спасибо за пакет!
 G. Perich06 окт. 2017 г., 10:25
Извините за то, что я так долго принял ответ. Спасибо тысячу раз за ваши объяснения !!
 Uwe20 сент. 2017 г., 15:58
Отличная идея взять месяц четверга каждой недели. Это гарантирует, что вся неделя назначена месяцу, к которому относится большинство дней недели. Однако, чтобы быть в безопасности, я предлагаю создать строку год-месяц и упростить код, т.е.yr_mon := format(ISOweek2date(sprintf("%i-W%02i-4", Year, Week))).
 G. Perich20 сент. 2017 г., 14:27
Спасибо, это сработало для меня! Я выбрал ваш ответ, потому что в моих данных он больше подходит для последующей реализации в течение других лет.

Ваш ответ на вопрос