3

次のような組み合わせを、私が思っていたよりも良い方法で数える方法を誰かが考えているのではないかと思います。

> library(lubridate)
> df <- data.frame(x=sample(now()+hours(1:3), 100, T), y=sample(1:4, 100, T))
> with(df, as.data.frame(table(x, y)))
                     x y Freq
1  2012-06-15 00:10:18 1    5
2  2012-06-15 01:10:18 1    9
3  2012-06-15 02:10:18 1    8
4  2012-06-15 00:10:18 2    9
5  2012-06-15 01:10:18 2   10
6  2012-06-15 02:10:18 2   12
7  2012-06-15 00:10:18 3    7
8  2012-06-15 01:10:18 3    9
9  2012-06-15 02:10:18 3    6
10 2012-06-15 00:10:18 4    5
11 2012-06-15 01:10:18 4   14
12 2012-06-15 02:10:18 4    6

私はそのフォーマットが好きですが、残念ながら、私たちが実行xyて通過したときtable()、それらはファクターに変換されました。最終的な出力では、元のタイプとして非常にうまく存在できますが、そこに到達するのは問題があるようです。現在、後ですべてのタイプを手動で修正するだけですが、タイムゾーンを再設定したり、デフォルトの日付形式のパーセントコードを検索したりする必要があるため、非常に面倒です。

効率的な解決策には、オブジェクトをハッシュするか、整数をの一意の値にマッピングxして、yを使用tabulate()してから元に戻すことが含まれるようです。

アイデア?

4

2 に答える 2

5

data.table列クラスを保持するバージョンは次のとおりです。

library(data.table)

dt <- data.table(df, key=c("x", "y"))
dt[, .N, by=key(dt)]
#                       x y  N
#  1: 2012-06-14 18:10:22 1  8
#  2: 2012-06-14 18:10:22 2 10
#  3: 2012-06-14 18:10:22 3  8
#  4: 2012-06-14 18:10:22 4  8
#  5: 2012-06-14 19:10:22 1  6
#  6: 2012-06-14 19:10:22 2  8
#  7: 2012-06-14 19:10:22 3  6
#  8: 2012-06-14 19:10:22 4  6
#  9: 2012-06-14 20:10:22 1 15
# 10: 2012-06-14 20:10:22 2  5
# 11: 2012-06-14 20:10:22 3 12
# 12: 2012-06-14 20:10:22 4  8

str(dt[, .N, by=key(dt)])
# Classes ‘data.table’ and 'data.frame':  12 obs. of  3 variables:
#  $ x: POSIXct, format: "2012-06-14 18:10:22" "2012-06-14 18:10:22" ...
#  $ y: int  1 2 3 4 1 2 3 4 1 2 ...
#  $ N: int  8 10 8 8 6 8 6 6 15 5 ...

フォローアップの質問に応じて編集する

観測された因子レベル(データに表示されないものを含む)のすべての可能な組み合わせの出現数をカウントするには、次のようなことを行うことができます。

dt<-dt[1:30,]  # Make subset of dt in which some factor combinations don't appear

ii <- do.call("CJ", lapply(dt, unique))  # CJ() is similar to expand.grid()
dt[ii, .N]
#                      x y N
# 1: 2012-06-14 22:53:05 1 8
# 2: 2012-06-14 22:53:05 2 7
# 3: 2012-06-14 22:53:05 3 9
# 4: 2012-06-14 22:53:05 4 5
# 5: 2012-06-14 23:53:05 1 1
# 6: 2012-06-14 23:53:05 2 0
# 7: 2012-06-14 23:53:05 3 0
# 8: 2012-06-14 23:53:05 4 0
于 2012-06-15T00:14:02.273 に答える
3

使用できますddply

library(plyr)

ddply(df, .(x, y), summarize, Freq = length(y))

それまでに手配したいy場合x

ddply(df, .(y, x), summarize, Freq = length(y))

または、行の順序だけでなく列の順序も重要な場合

arrange(ddply(df, .(x, y), summarize, Freq = length(y)), y)
于 2012-06-14T23:45:12.977 に答える