#r #date #split #aggregate #subset
#r #Дата #сплит #агрегат #подмножество
Вопрос:
Я пытаюсь создать среднемесячное значение осадков для двух разных временных наборов, но я не могу заставить данные быть разделенными на две части перед выполнением агрегирования.
У меня есть набор данных о ежедневных осадках с 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)
Ответ №1:
Вместо разделения наборов данных вы можете создать новый столбец, чтобы различать две группы и брать 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)
Комментарии:
1. Спасибо за ваш ответ! Я попробовал ваш скрипт следующим образом:
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
, есть идеи?2. Спасибо, я попробую еще раз поработать с df и x. Вот пример набора данных. Год Месяц День Дата Average_QS Average_TN Average_TX Average_WS Average_P 2006 1 1 2006-01-01 4706.250 7.372229 14.47186 2.6203508 6.560209e 00
3. Извините, я новичок в этом, очень благодарен за ваши ответы. Я попытался сделать выборку набора данных на основе страницы, которую вы мне прислали. Надеюсь, это сработает!
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)
4. Я пытался это сделать, но он не переходит в «режим сценария» в описании, его все еще можно использовать таким образом?