2017-07-05 12 views
1

データセット内の各参加者の移動平均を計算したいと思います。どのように異なる開始日の移動平均を計算するのですか?

参加者に複数の訪問日があり、過去3日間および各訪問前の過去2日間の平均値(訪問日を除く)を計算したいと思います。

たとえば、let id = 1、date = 6/6/2017とします。

過去2日間の平均値は、2011年6月5日と2011年6月4日の平均値である必要があります。

サンプルデータセットは以下のように生成されます。 私ははるかに大きなデータセット、より多くの参加者、より多くの訪問、そしてより価値の高い日々に取り組んでいます。私はこれらの平均を計算する効率的な方法を見出したいと思います。

timeseries <- data.frame(id=c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3),       date=c("6/1/2017","6/2/2017","6/3/2017","6/4/2017","6/5/2017","6/6/2017", 
          "6/1/2017","6/2/2017","6/3/2017","6/4/2017","6/5/2017","6/6/2017", 
          "6/1/2017","6/2/2017","6/3/2017","6/4/2017","6/5/2017","6/6/2017"), 
        value=c(2,3,4,NA,6,7, 
          NA,9,5,NA,3,2, 
          5,7,3,8,3,5)) 
> timeseries 
    id  date value 
1 1 6/1/2017  2 
2 1 6/2/2017  3 
3 1 6/3/2017  4 
4 1 6/4/2017 NA 
5 1 6/5/2017  6 
6 1 6/6/2017  7 
7 2 6/1/2017 NA 
8 2 6/2/2017  9 
9 2 6/3/2017  5 
10 2 6/4/2017 NA 
... 

visit <- data.frame(id=c(1,1,2,3,3,3), 
       date=c("6/6/2017","6/5/2017", 
         "6/6/2017", 
         "6/6/2017","6/5/2017","6/4/2017")) 

> visit 
    id  date 
1 1 6/6/2017 
2 1 6/5/2017 
3 2 6/6/2017 
4 3 6/6/2017 
5 3 6/5/2017 
6 3 6/4/2017 

結果表はmean3は、過去3日間の平均値であり、mean2過去2日間各idのため

> result 
    id  date mean3 mean2 
1 1 6/6/2017    
2 1 6/5/2017    
3 2 6/6/2017    
4 3 6/6/2017    
5 3 6/5/2017    
6 3 6/4/2017  

答えて

0

の平均値であり、このようなものでなければなりませんvisittimeseriesから対応するデータをサブセット化し、次にvaluemeanを計算し、n_daysの範囲内にある。

library(lubridate) 
n_days = 2 
sapply(1:NROW(visit), function(i) 
    with(subset(x = timeseries, 
       subset = timeseries$id == visit$id[i]), 
     mean(x = value[difftime(time1 = mdy(visit$date[i]), 
           time2 = mdy(date), 
           units = "days") <= n_days & 
          difftime(time1 = mdy(visit$date[i]), 
           time2 = mdy(date), 
           units = "days") > 0], 
       na.rm = TRUE))) 
#[1] 6.0 4.0 3.0 5.5 5.5 5.0 
+0

ありがとうございます。しかし、私はこれが正しい答えを与えるとは思わない。あなたの結果(6.500000)から最初の値を見ると、この数値はid = 1の過去2日間の平均値(mean2)を2014年6月6日までに表すはずです。時系列データセットによると、このmean2は6でなければなりません(2017年6月5日の値のみが利用可能であると仮定すると) – cyrusjan

+0

ありがとうございます。これは役立ちます – cyrusjan

関連する問題