Я пытаюсь создать среднемесячное значение осадков для двух разных наборов времени, но не могу разделить данные на две части перед агрегированием.
У меня есть набор данных о ежедневных осадках с 01-01-2006 по 31-12-2099, и я хочу агрегировать за месяц за период времени с (01-01-2015 по 31-12-2054) и (01-01 -2055 до 31-12-2099).
Я использовал агрегатную функцию, чтобы создать среднее значение за месяц, подобное этому. Но теперь у меня есть среднее значение за месяц по всему набору данных (2006-2100), и я хочу иметь два списка (один с 01-01-2015 по 31-12-2054 и один с 01-01-2055 по 31- 12-2099). Я думаю, что мне нужно создать подмножество или разделить данные, но я не могу найти, как совместить это с агрегатной функцией. Большое спасибо!
months = Alentejo_RCP4.5_Average$Month
Alentejo_RCP4.5_Average.myma = aggregate(x = Alentejo_RCP4.5_Average,
by = list(months), FUN = mean)
Я также пробовал это, но он просто берет даты, а не прикрепленные значения к дате.
df <- data.frame(date=as.Date("2015-01-01")+1:365, x=1:365)
list <- split(df,df$date<as.Date("2055-01-01"))
zz <- " Year Month Day Date Average_P
2006 1 1 2006-01-01 6.5
2007 1 2 2007-01-02 2.8
2055 3 3 2055-03-03 3.5
2058 3 4 2058-03-04 5.1
2060 5 5 2060-05-05 3.2"
Data <- read.table(text=zz, header = TRUE)
Вместо разделения наборов данных вы можете создать новый столбец, чтобы различать две группы и взять mean
для каждой группы и каждого месяца.
Data %>%
mutate(Date = as.Date(Date),
group = ifelse(Date < as.Date("2055-01-01"),
'below_2055', 'above_2055'),
month = format(Date, '%m-%Y')) %>%
group_by(group, Date) %>%
summarise(Average_P = mean(Average_P)) -> result
Или в базе R:
Data$Date <- as.Date(Data$Date)
aggregate(Average_P~group + month,
transform(Data,
group = ifelse(Date < as.Date("2055-01-01"),
'below_2055', 'above_2055'),
month = format(Date, '%m-%Y')), mean) -> result
Если вам нужен окончательный вывод в виде списка, вы можете использовать split
.
split(result,result$group)
Спасибо! Попробую еще раз поработать с df и x. Вот пример набора данных. Год Месяц День Дата Среднее_QS Среднее_TN Среднее_TX Среднее_WS Среднее_P 2006 1 1 01.01.2006 4706,250 7,372229 14,47186 2,6203508 6,560209e+00
Извините, я совсем новичок в этом, очень благодарен за ваши ответы. Я попытался сделать образец набора данных на основе страницы, которую вы мне прислали. Надеюсь, что это работает! zz <- " Year Month Day Date Average_QS Average_TN Average_TX Average_WS Average_P 1 2006 1 1 2006-01-01 4706 7.37 14 2.6 6.5 2 2007 1 2 2007-01-02 5659 5.71 13 2.4 2.8 3 2055 3 3 2055-03-03 4427 5.72 13 1.9 3.5 4 2058 3 4 2058-03-04 3172 9.37 14 2.3 5.1 5 2060 1 5 2060-01-05 4947 8.32 13 2.6 3.2" Data <- read.table(text=zz, header = TRUE)
Я пытался это сделать, но он не переходит в «режим сценария» в описании, его все еще можно использовать в таком виде?
Спасибо за ваш ответ! Я попробовал ваш скрипт следующим образом:
aggregate(Alentejo_RCP4.5_Average$Average_P + Alentejo_RCP4.5_Average$Month, transform(df, group = ifelse(date < as.Date('2055-01-01'), 'below_2055', 'above_2055'), month = format(date, '%m-%Y')), mean) -> result result
Но я получаю эту ошибкуError in as.data.frame.default(x[[i]], optional = TRUE) : cannot coerce class ‘"function"’ to a data.frame
Есть идеи?