Как объединить агрегат за месяц и разделение набора данных на определенную дату

#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. Я пытался это сделать, но он не переходит в «режим сценария» в описании, его все еще можно использовать таким образом?