как определить отклонение температуры от нормальной по температуре — R 4.0.0

#r #dplyr #rnoaa

#r #dplyr #rnoaa

Вопрос:

Я работал над набором данных, который будет универсальным на нескольких климатических станциях для анализа температуры и осадков. Я столкнулся с кирпичной стеной, проектируя «климатические нормы», я успешно рассчитал среднюю дневную температуру TAVG , среднюю температуру за месяц AVG_TAVG и суммировал PRCP и SNOW для месячных итогов.

Где я нахожусь в тупике, это вычисление отклонения от нормы, в настоящее время данные за 1981-2010 годы считаются климатическими нормами.

Вот как выглядит мой набор данных в настоящее время:

 mso_light
    
    year month day  date       PRCP SNOW  SNWD TMAX TMIN  TAVG
1   1948    1   1   1948-01-01    0    0   102   44 -122 -39.0
2   1948    1   2   1948-01-02    3    0    51   44    6  25.0
3   1948    1   3   1948-01-03    0    0    25   44  -39   2.5
4   1948    1   4   1948-01-04   38   64    76   33  -56 -11.5
5   1948    1   5   1948-01-05    0    0    76   -6  -83 -44.5
6   1948    1   6   1948-01-06  107    0    51   22  -61 -19.5
7   1948    1   7   1948-01-07  147    0    25   28  -17   5.5
8   1948    1   8   1948-01-08    8   13    25   39  -83 -22.0
9   1948    1   9   1948-01-09    0    0    25   -6 -117 -61.5
10  1948    1   10  1948-01-10    8   10    25  -11 -156 -83.5
  

Итак, я изначально чувствовал, что мне нужно date для целей сортировки, я удалю это, если в будущем не понадобится.

Далее я хотел бы добавить столбец для DepNormT , который вычисляется путем взятия каждого периода с 1 января по 31 декабря с 1981 по 2010 год и усреднения TAVG , чтобы найти нормальную среднюю температуру. Тогда DepNormT будет разница между ним самим и TAVG для всего набора данных.

Я перепробовал несколько способов добиться этого, вот две версии:

 mso_DeptT <- mso_light %>%
  group_by(month, day) %>%
  mean(mso_light$TAVG[1981:2010], na.rm = T) %>%
  ungroup()
  

Это выдает мне следующую ошибку:

   no applicable method for 'ungroup' applied to an object of class "c('double', 'numeric')"
In addition: Warning message:
In mean.default(., mso_light$TAVG[1981:2010], na.rm = T) :
  argument is not numeric or logical: returning NA
  

Это другая версия:

 ##mso_DeptT <- filter(mso_light, year >= "1981", year <= "2010") %>%
##  group_by(day, month) %>%
##  mutate(daily_DeptT = mean(TAVG, na.rm = T)) %>%
##  ungroup()

mso_sum <- mso_light %>%
  group_by(month, year) %>% 
  summarize(AVG_TAVG=mean(TAVG, na.rm = TRUE),
          T_PRCP=sum(PRCP, na.rm=TRUE),
          T_SNOW=sum(SNOW, na.rm=TRUE)) %>% 
  ungroup()

## To find monthly normal precipitation and snowfall - using dataset mso_sum

cli_Avg <- filter(mso_sum, year >= "1981", year <= "2010") %>%
  group_by(month) %>%
  summarize(Mon_Precip = mean(T_PRCP, na.rm = T),
            Mon_Snow = mean(T_SNOW, na.rm = T))
  

Это дало мне среднее значение за 30 лет, которое было равно среднему значению за каждый отдельный день TAVG . Например:

     year month day  date       PRCP SNOW  SNWD TMAX TMIN  TAVG  DepNormT
1   1948    1   1   1948-01-01    0    0   102   44 -122 -39.0      -39.0
2   1948    1   2   1948-01-02    3    0    51   44    6  25.0       25.0
3   1948    1   3   1948-01-03    0    0    25   44  -39   2.5        2.5
4   1948    1   4   1948-01-04   38   64    76   33  -56 -11.5        ect
5   1948    1   5   1948-01-05    0    0    76   -6  -83 -44.5          .
6   1948    1   6   1948-01-06  107    0    51   22  -61 -19.5          .
7   1948    1   7   1948-01-07  147    0    25   28  -17   5.5          .
8   1948    1   8   1948-01-08    8   13    25   39  -83 -22.0
9   1948    1   9   1948-01-09    0    0    25   -6 -117 -61.5
10  1948    1   10  1948-01-10    8   10    25  -11 -156 -83.5
  

Спасибо за предложения.

Комментарии:

1. Если вы предоставите некоторые примеры данных, вам будет легче помочь. Вы можете использовать dput(sample of your dataframe) для предоставления образца. В противном случае нам придется вручную создавать данные, чтобы попробовать что-либо.

2. Вам нужно summarize(TAVG = mean(TAVG[1981:2010]) не просто вызывать mean() напрямую.