Проблема при вычислении среднего значения между двумя датами с использованием столбца в R

#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. Как я могу это исправить?