2

次のようなデータセット (x) があります。

        DATE  WEEKDAY      A          B           C            D
 2011-02-04   Friday      113        67         109           72
 2011-02-05 Saturday        1         0           0            1
 2011-02-06   Sunday        9         5           0            0
 2011-02-07   Monday      154        48          85           60

力(x):

'data.frame':   4 obs. of  6 variables:
 $ DATE   : Date, format: "2011-02-04" "2011-02-05" "2011-02-06" "2011-02-07"
 $ WEEKDAY: Factor w/ 7 levels "Friday","Monday",..: 1 3 4 2
 $ A      : num  113 1 9 154
 $ B      : num  67 0 5 48
 $ C      : num  109 0 0 85
 $ D      : num  72 1 0 60

火曜日 - 土曜日の値は変わりませんが、日曜日は土曜日と日曜日の合計、月曜日は土曜日、日曜日、月曜日の合計になります。

土曜日と日曜日の日付をそれぞれ日付 + 2 と日付 + 1 にシフトしてから、日付で集計しようとしましたが、週末の記録が失われます。

私の例では、正しい結果は次のようになります。

        DATE  WEEKDAY      A          B           C            D
 2011-02-04   Friday      113        67         109           72
 2011-02-05 Saturday        1         0           0            1
 2011-02-06   Sunday       10         5           0            1
 2011-02-07   Monday      164        53          85           61

週末の値を次の日にロールアップするにはどうすればよいですか?

3 週間分のデータ:

         DATE   WEEKDAY   A   B   C   D
1  2011-01-02    Sunday   2   1   0   0
2  2011-01-03    Monday 153  51   7   1
3  2011-01-04   Tuesday 182 103  13   5
4  2011-01-05 Wednesday 192 102  14  12
5  2011-01-06  Thursday 160  67  50  20
6  2011-01-07    Friday 154  96  50  39
7  2011-01-09    Sunday   0   0   0   1
8  2011-01-10    Monday 195  94  48  39
9  2011-01-11   Tuesday 206  72  71  38
10 2011-01-12 Wednesday 232  94  96  52
11 2011-01-13  Thursday 178 113  93  52
12 2011-01-14    Friday 173  97  68  56
13 2011-01-15  Saturday   2   0   1   0
14 2011-01-17    Monday 170  91  66  52
15 2011-01-18   Tuesday 176  76  70  78
16 2011-01-19 Wednesday 164 159 117  37
17 2011-01-20  Thursday 198  87  95 111
18 2011-01-21    Friday 213  86  89  90
19 2011-01-24    Monday 195  73 102  52
20 2011-01-25   Tuesday 193 108 116  70
21 2011-01-26 Wednesday 193 102 118  63
4

1 に答える 1

3

小さなデータを提供したため、より大きなデータでこれをテストできませんでした。しかし、アイデアはこのようなものです。data.tableここでは非常に効率的であることがわかったので使用します。

コード:

require(data.table) 
my_days <- c("Saturday", "Sunday", "Monday")
dt <- data.table(df)
dt[, `:=`(DATE = as.Date(DATE))]
setkey(dt, "DATE")
dt[WEEKDAY %in% my_days, `:=`(A = cumsum(A), B = cumsum(B), 
            C = cumsum(C), D = cumsum(D)), by = format(DATE-1, "%W")]

アイデア:

  • まず、(4 行目) を使用して、DATE列を実際のDate型に変更しas.Dateます。
  • DATE次に、キー列をdtto DATE(5 行目)に設定して、列が列ごとに並べ替えられるようにします。
  • さて、最後の行 (6 行目) はすべての魔法が発生する場所であり、最もトリッキーです。
    • 式の最初の部分は、days = のみで dt をWEEKDAY %in% my_days,サブセット化します。data.tableSat, Sun or Mon
    • 同じ行の最後の部分はby = format(DATE-1, "%W")、データが属する週ごとにデータをサブセット化します。ここではMonday、次の週になるため、現在の日付から 1 を引いて週番号を取得します。これによりWeek、日付が でグループ化されます。火曜日から月曜日までは同じ週になります。
    • 中央の式は を':='(A = ... , D = ...)計算し、cumsum参照によるグループ化ごとにそれらの値だけを置き換えます。

あなたが投稿した新しいデータについては、結果としてこれを取得します。それがあなたが求めているものでない場合はお知らせください。

#           DATE   WEEKDAY   A   B   C   D
#  1: 2011-01-02    Sunday   2   1   0   0
#  2: 2011-01-03    Monday 155  52   7   1
#  3: 2011-01-04   Tuesday 182 103  13   5
#  4: 2011-01-05 Wednesday 192 102  14  12
#  5: 2011-01-06  Thursday 160  67  50  20
#  6: 2011-01-07    Friday 154  96  50  39
#  7: 2011-01-09    Sunday   0   0   0   1
#  8: 2011-01-10    Monday 195  94  48  40
#  9: 2011-01-11   Tuesday 206  72  71  38
# 10: 2011-01-12 Wednesday 232  94  96  52
# 11: 2011-01-13  Thursday 178 113  93  52
# 12: 2011-01-14    Friday 173  97  68  56
# 13: 2011-01-15  Saturday   2   0   1   0
# 14: 2011-01-17    Monday 172  91  67  52
# 15: 2011-01-18   Tuesday 176  76  70  78
# 16: 2011-01-19 Wednesday 164 159 117  37
# 17: 2011-01-20  Thursday 198  87  95 111
# 18: 2011-01-21    Friday 213  86  89  90
# 19: 2011-01-24    Monday 195  73 102  52
# 20: 2011-01-25   Tuesday 193 108 116  70
# 21: 2011-01-26 Wednesday 193 102 118  63
#           DATE   WEEKDAY   A   B   C   D
于 2013-04-23T21:33:58.757 に答える