2

可能な時間と可能なアイテムのベクトルがある場合:

possible.items = c(12,13,14,15,16)
possible.hours = 0:23

そして、それらを購入した時間にそれらのアイテムを購入した顧客に関するいくつかのデータ:

frame = data.frame(id=101:105, hour=c(0,0,0,1,1), item=c(12,14,12,12,15))

可能な時間ごとに行があり、アイテムの組み合わせにデータセットの関連する行数が入力されたサマリーデータフレームを作成するにはどうすればよいですか?

サマリーデータフレームを作成する方法は知っていますが、元のデータセット「フレーム」にない行を含むフレームはありません。

summary = aggregate(id~hour+item, data=frame, FUN=length)

また、考えられるすべての組み合わせを取得する方法もあります。

poss = merge(data.frame(hour=possible.hours), data.frame(item=possible.items), all=TRUE)

2つを組み合わせる方法がわかりません。また、私が下る道が正しいかどうかもわかりません。

次のようなデータフレームを取得したいと思います。

hour item count
   0   12     2
   0   13     0
   0   14     1
   0   15     0
   0   16     0
   1   12     1
...
  23   16     0
4

2 に答える 2

3

もうすぐです。マージしてhouritem必要なものを提供します。

あなたがそれらを定義したようにpossそして:summary

result <- merge(poss, summary, by=c('hour','item'),all=T)
names(result)[3] <- 'count'
result$count[is.na(result$count)] <- 0

> head(result)
  hour item count
1    0   12     2
2    0   13     0
3    0   14     1
4    0   15     0
5    0   16     0
6    1   12     1

コメント(およびブランドンの回答で提案されている)のexpand.gridように、すべての組み合わせを生成する適切な方法は次のとおりです。

poss <- expand.grid(list(hour=0:23, item=12:16))
于 2012-12-21T21:28:26.357 に答える
1

これは私がplyrを使用してそれを行う方法です

require(plyr)
purchases <- data.frame(id = 101:105, hour = c(0,0,0,1,1), item = c(12,14,12,12,15))
results.table <- merge(expand.grid(list(hour = 0:23, item = 12:16)), purchases, by = c('hour', 'item'), all = TRUE)
summary.table <- ddply(results.table, c("hour", "item"), summarise, count = length(na.omit(id)))

この方法では、最初にpossible。*とサマリーテーブルを作成する必要がなく、いくつかの手順を節約できます。

于 2012-12-21T22:11:46.217 に答える