Rを使って、曜日別に集計する方法は?

私はdf/zoo/xts /それが週の刻みで分けられています。私はさらに、各エントリごとにこれを週ごとに分割したいと思います。

たとえば、金曜日の場合、idのリストと各idの時刻が関連付けられています。これらの時間は、1年のうちのどの金曜日でもかまいません。私はその金曜日に毎週(順番に)カウントとともに各IDを持つ新しいdfを作成したいと思います。

それは、次のようになります。ここで、各w列は異なる金曜日のカウントです。

    id w1 w2 w3 w4
1 id_1  1  2  2  8
2 id_2  3  1  5  2
3 id_3  7  4 10  7

dput:

structure(list(id = c("id_1", "id_2", "id_3"), w1 = c(1, 3, 7
), w2 = c(2, 1, 4), w3 = c(2L, 5L, 10L), w4 = c(8L, 2L, 7L)), .Names = c("id", 
"w1", "w2", "w3", "w4"), row.names = c(NA, 3L), class = "data.frame")

これは集約のために熟しているようですが、構文の権利はかなり得られません。私が試した他のことは以下の通りです:

# Applies sum to everything, which doesnt make sense in this context
apply.weekly(friday, sum)

# I considered doing something like getting the unique weeks with:
as.numeric(unique(format(friday[,2], "%U")))
# and then generating each week, getting the counts for each user, and then making a new df from this process. But this seems very inefficient.  

編集: strからの出力(data [1:20、]):

'data.frame':   20 obs. of  2 variables:
 $ id  : num  1 2 3 4 5 1 2 3 3 2 ...
 $ time: POSIXct, format: "2011-04-25 14:00:00" "2011-04-28 20:00:00" "2011-05-03 06:00:00" "2011-05-06 14:00:00" ...

dputからの出力(data [1:20、]):

structure(list(id = c(1, 2, 3, 4, 5, 1, 2, 3, 3, 2, 1, 4, 3, 
2, 1, 4, 3, 2, 1, 7), time = structure(c(1303754400, 1304035200, 
1304416800, 1304704800, 1304920800, 1305252000, 1305428400, 1305522000, 
1305774000, 1306404000, 1306422000, 1308261600, 1308290400, 1308340800, 
1308542400, 1308715200, 1308722400, 1308844800, 1309575600, 1309730400
), class = c("POSIXct", "POSIXt"))), .Names = c("id", "time"), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 
9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L), class = "data.frame")
3
あなたがこれまでに持っているものを投稿してください
追加された 著者 Michael Durrant,
追加された 著者 Chase,
おそらく他の人がこれに従うことができますが、私はできません。実際に役に立つのは、 str(data)の出力を投稿し、いくつかの偽のデータを使って再現可能な例を作成した場合です。
追加された 著者 joran,
あなたのコメントを反映するように編集されました。
追加された 著者 user592419,
うん、私達にplsを打つ。 dput(datas [1:20、])やそのようなもの
追加された 著者 Rguy,
Dputを提供していただきありがとうございます。他の誰かがあなたがここで欲しいものを理解するかもしれませんが、私はまだ不明です。結果を望むものの人工サンプルデータフレームを作成できますか?
追加された 著者 Rguy,

1 答え

あなたが望むものを理解している場合は、その曜日(それを識別できるように)とその週の追加の列を作成する必要があります(各列ごとに別々の列にすることができます)。あなたが dput()を与えた data を使って:

data$day.of.week <- format(data$time, "%A")
data$week.of.year <- format(data$time, "%U")

実際にはデータを変更したいので、 reshape2 パッケージを使用してください(唯一の方法ではありませんが、私がよく知っている方法です)

library("reshape2")

dcast(data[data$day.of.week=="Friday",], id~week.of.year, 
    value_var="time", fun.aggregate=length)

この例では、金曜日に取得するためにデータをサブセット化しました。すべての日を、毎日別々にやりたいのであれば、 plyr パッケージはその繰り返しに役立ちます。

library("plyr")

dlply(data, .(day.of.week), dcast, id~week.of.year, 
    value_var="time", fun.aggregate=length)

これら2つの結果は次のとおりです。

> dcast(data[data$day.of.week=="Friday",], id~week.of.year, value_var="time", fun.aggregate=length)
  id 18 24 26
1  1  0  0  1
2  2  0  1  0
3  4  1  0  0

> dlply(data, .(day.of.week), dcast, id~week.of.year, value_var="time", fun.aggregate=length)
$Friday
  id 18 24 26
1  1  0  0  1
2  2  0  1  0
3  4  1  0  0

$Monday
  id 17
1  1  1

$Saturday
  id 19
1  2  1

$Sunday
  id 19 20 25 27
1  1  0  0  1  0
2  3  0  1  0  0
3  5  1  0  0  0
4  7  0  0  0  1

$Thursday
  id 17 19 21 24 25
1  1  0  1  1  0  0
2  2  1  0  1  0  1
3  3  0  0  0  1  0
4  4  0  0  0  1  0

$Tuesday
  id 18 25
1  3  1  1
2  4  0  1

$Wednesday
  id 20
1  3  1

attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
  day.of.week
1      Friday
2      Monday
3    Saturday
4      Sunday
5    Thursday
6     Tuesday
7   Wednesday
4
追加された
私は、最新のreshape2とddplyパッケージがparrelisationをサポートしていると思います(しかし、わかりません)。複数のコアマシン(または複数のマシンへのアクセス)をお持ちの場合は、処理速度が遅くなる可能性があります。
追加された 著者 PaulHurleyuk,
はい、これは私が探しているものです。私はそれを複製しようとしたところ、私がやっているデータのサイズでは、dcast/dlplyコマンドが非常に長くかかることがわかりました。この部分をするためにRを取り除くだけかもしれません。
追加された 著者 user592419,
私はこれを試みた。それはまだ時間がかかります。しかし、スピードアップはいくつかのセットで顕著です。先端に感謝します。
追加された 著者 user592419,