суммировать ежедневное значение для еженедельного среднего для каждого идентификатора - PullRequest
0 голосов
/ 17 октября 2018

У меня есть фрейм данных с идентификаторами, которые содержат значения в отдельные последовательные периоды времени, теперь я хочу создать столбец, который является средним недельным значением ежедневных данных.

df
id   date      value
 1   2018-1-12 3
 1   2018-1-13 4
 1   2018-1-14 5
 1   2018-1-15 5
 1   2018-1-16 3
 1   2018-1-17 5
 1   2018-1-18 5
 1   2018-1-19 5
 2   2017-1-14 8
 .
 .
 .
 12  2016-12-10 7

я хочу, чтобы мой df был

df
id   date      value  mean_week
 1   2018-1-12 3      mean(7 consecutive days starting 2018-1-12 and id=1)
 1   2018-1-13 4      mean(7 consecutive days starting 2018-1-12 and id=1)
 1   2018-1-14 5      mean(7 consecutive days starting 2018-1-12 and id=1)
 1   2018-1-15 5      mean(7 consecutive days starting 2018-1-12 and id=1)
 1   2018-1-16 3      mean(7 consecutive days starting 2018-1-12 and id=1)
 1   2018-1-17 5      mean(7 consecutive days starting 2018-1-12 and id=1)
 1   2018-1-18 5      mean(7 consecutive days starting 2018-1-12 and id=1)
 1   2018-1-19 5      NA(since there is no consecutive seven days)
 2   2017-1-14 5      mean(7 consecutive days starting 2017-1-14 and id=2)
 .
 .
 .
 12  2016-12-10 7    NA(since there is no consecutive seven days)

Я искал простой способ, но на данный момент я делаю это только в цикле.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Суммируйте ваши данные, сгруппированные по неделям.Но используйте mutate(), чтобы каждая строка получала суммарное значение.

df <- data.frame(date = as.Date("2018-01-01")+1:100,
                 value = sample(1:10,size = 100,replace = TRUE))


require(dplyr)
require(lubridate)



df %>% mutate(week = week(date)) %>%
  group_by(week) %>%
  mutate(summary = paste(round(mean(value),1),"(",n()," consecutive days starting ",min(date),")"))

дает

date value  week                                           summary
<date> <int> <dbl>                                             <chr>
1  2018-01-02     3     1 4.7  ( 6  consecutive days starting  2018-01-02 )
2  2018-01-03     6     1 4.7  ( 6  consecutive days starting  2018-01-02 )
3  2018-01-04     1     1 4.7  ( 6  consecutive days starting  2018-01-02 )
4  2018-01-05     1     1 4.7  ( 6  consecutive days starting  2018-01-02 )
5  2018-01-06    10     1 4.7  ( 6  consecutive days starting  2018-01-02 )
6  2018-01-07     7     1 4.7  ( 6  consecutive days starting  2018-01-02 )
7  2018-01-08     2     2   4  ( 7  consecutive days starting  2018-01-08 )
8  2018-01-09     2     2   4  ( 7  consecutive days starting  2018-01-08 )
9  2018-01-10     5     2   4  ( 7  consecutive days starting  2018-01-08 )
10 2018-01-11     7     2   4  ( 7  consecutive days starting  2018-01-08 )
0 голосов
/ 17 октября 2018

Примерно так, но я не понял условия начала недели

library(tidyverse)
 df=read.table(text="id   date      value
  1   2018-1-12 3
               1   2018-1-13 4
               1   2018-1-14 5
               1   2018-1-16 3
               1   2018-1-17 5",header=T)

 library(lubridate)
 df%>%
   mutate(week=isoweek(date))%>%
   group_by(week,id)%>%
   mutate(mean_week=mean(value,na.rm = T))
# A tibble: 5 x 5
# Groups:   week, id [2]
     id date      value  week mean_week
  <int> <fct>     <int> <dbl>     <dbl>
1     1 2018-1-12     3    2.        4.
2     1 2018-1-13     4    2.        4.
3     1 2018-1-14     5    2.        4.
4     1 2018-1-16     3    3.        4.
5     1 2018-1-17     5    3.        4.
...