#r #date #range #mean
#r #Дата #диапазон #среднее
Вопрос:
Мне нужно вычислить среднее значение столбца на основе двух дат. Таблица данных показана ниже.
pol id acres date mean st_date end_date
12345 5 123.8 05_26_2019 0.2225 2019-07-24 2019-09-07
12345 5 123.8 06_11_2019 0.6523 2019-07-24 2019-09-07
12345 5 123.8 06_27_2019 0.8563 2019-07-24 2019-09-07
12345 5 123.8 07_13_2019 0.1542 2019-07-24 2019-09-07
12345 5 123.8 07_29_2019 0.4253 2019-07-24 2019-09-07
12345 5 123.8 09_15_2019 0.1521 2019-07-24 2019-09-07
67890 4 60.0 05_05_2019 0.3652 2019-07-15 2019-08-31
67890 4 60.0 06_02_2019 0.4585 2019-07-15 2019-08-31
67890 4 60.0 07_10_2019 0.5856 2019-07-15 2019-08-31
67890 4 60.0 07_18_2019 0.6585 2019-07-15 2019-08-31
67890 4 60.0 09_02_2019 0.8585 2019-07-15 2019-08-31
Мне нужно получить среднее значение среднего столбца для дат в столбце date, которое находится между st_date и end_date. Желаемый результат показан ниже. среднее значение. столбец среднее значение средних значений столбцов дат в столбце date находится между st_date и end_date. (0.4253 0.1521)/2 = 0.2887
Output:
pol id acres date mean st_date end_date avg.
12345 5 123.8 05_26_2019 0.2225 2019-07-24 2019-09-16 0.2887
12345 5 123.8 06_11_2019 0.6523 2019-07-24 2019-09-16 0.2887
12345 5 123.8 06_27_2019 0.8563 2019-07-24 2019-09-16 0.2887
12345 5 123.8 07_13_2019 0.1542 2019-07-24 2019-09-16 0.2887
12345 5 123.8 07_29_2019 0.4253 2019-07-24 2019-09-16 0.2887
12345 5 123.8 09_15_2019 0.1521 2019-07-24 2019-09-16 0.2887
Может кто-нибудь помочь мне разобраться в этом? Я предпочитаю решение data.table.
Спасибо,
Ответ №1:
Не уверен, что у вас несколько групп, и вам нужно рассчитать среднее значение для каждой группы. Если это так, пожалуйста, посмотрите, работает ли приведенный ниже код для вас:
> library(dplyr)
> library(tidyr)
> df %>%
left_join(df %>% group_by(id) %>% filter(date> st_date amp; date < end_date) %>% mutate(avg = mean(mean)) %>% select(id, date, avg), by = c('id' = 'id', 'date' = 'date'), keep = F) %>% mutate(avg = replace_na(avg, mean(avg, na.rm = T)))
# A tibble: 6 x 8
pol id acres date mean st_date end_date avg
<dbl> <dbl> <dbl> <date> <dbl> <date> <date> <dbl>
1 12345 5 124. 2019-05-26 0.222 2019-07-24 2019-09-16 0.289
2 12345 5 124. 2019-06-11 0.652 2019-07-24 2019-09-16 0.289
3 12345 5 124. 2019-06-27 0.856 2019-07-24 2019-09-16 0.289
4 12345 5 124. 2019-07-13 0.154 2019-07-24 2019-09-16 0.289
5 12345 5 124. 2019-07-29 0.425 2019-07-24 2019-09-16 0.289
6 12345 5 124. 2019-09-15 0.152 2019-07-24 2019-09-16 0.289
>
Мой код:
final_pl_date_sel %>%
left_join(df %>% group_by(pol,id,acres) %>% filter(date> st_date amp; date < end_date) %>% mutate(avg = mean(mean)) %>% select(pol, id, acres, date, avg), by = c('pol' = 'pol','id' = 'id','acres' = 'acres', 'date' = 'date'), keep = F) %>% mutate(avg = replace_na(avg, mean(avg, na.rm = T)))
Использование вашего кода:
> df %>%
left_join(df %>% group_by(pol, id, acres) %>% filter(date> st_date amp; date < end_date) %>%
mutate(avg = mean(mean)) %>% select(pol, id, acres, date, avg), by = c('pol' = 'pol','id' = 'id','acres' = 'acres', 'date' = 'date'), keep = F) %>%
mutate(avg = replace_na(avg, mean(avg, na.rm = T)))
# A tibble: 6 x 8
pol id acres date mean st_date end_date avg
<dbl> <dbl> <dbl> <date> <dbl> <date> <date> <dbl>
1 12345 5 124. 2019-05-26 0.222 2019-07-24 2019-09-16 0.289
2 12345 5 124. 2019-06-11 0.652 2019-07-24 2019-09-16 0.289
3 12345 5 124. 2019-06-27 0.856 2019-07-24 2019-09-16 0.289
4 12345 5 124. 2019-07-13 0.154 2019-07-24 2019-09-16 0.289
5 12345 5 124. 2019-07-29 0.425 2019-07-24 2019-09-16 0.289
6 12345 5 124. 2019-09-15 0.152 2019-07-24 2019-09-16 0.289
использовал «df» в качестве левой таблицы, поскольку у меня нет таблицы «final_pl_date_sel».
Мой df:
> df
# A tibble: 6 x 7
pol id acres date mean st_date end_date
<dbl> <dbl> <dbl> <date> <dbl> <date> <date>
1 12345 5 124. 2019-05-26 0.222 2019-07-24 2019-09-16
2 12345 5 124. 2019-06-11 0.652 2019-07-24 2019-09-16
3 12345 5 124. 2019-06-27 0.856 2019-07-24 2019-09-16
4 12345 5 124. 2019-07-13 0.154 2019-07-24 2019-09-16
5 12345 5 124. 2019-07-29 0.425 2019-07-24 2019-09-16
6 12345 5 124. 2019-09-15 0.152 2019-07-24 2019-09-16
>
Комментарии:
1. Это то, что я хочу. Да, у меня есть несколько групп. Знаете ли вы решение data.table для этого? Спасибо.
2. Извините, у меня нет решения data.table, работающего в основном с пакетами tibble и tidyverse. Поскольку они также работают с данными.таблицы
3. Когда я попробовал выше, я получаю эту ошибку «Ошибка в tbl_vars (y): аргумент «y» отсутствует, значение по умолчанию отсутствует». Понятия не имею, почему.
4. Не могли бы вы поделиться тем, что вы выполняете дословно.
5. На самом деле, когда я попытался, я получил другой ответ. мне нужно сгруппировать по pol, id и acres. Как я могу это исправить?