#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()
напрямую.