0

詳細な時系列データフレームを作成しようとしています。複数のデータ ポイントの月次データを取得し、複数の要因でグループ化しようとしています。ドキュメント、ビネット、または SO でこれに近い例を見たことがないため、これが可能かどうかはわかりません。

構造化しようとしているサンプルデータは次のとおりです。

clients <- 1:100
dates <- seq(as.Date("2012/1/1"), as.Date("2012/9/1"), "days")
categories <- LETTERS[1:5]
products <- data.frame(clientID = sample(clients, 10000, replace = TRUE), 
                       OrderDate = sample(dates, 10000, replace = TRUE), 
                       category = sample(categories, 10000, replace = TRUE),
                       numProducts = sample(1:10, 1000, replace = TRUE), 
                       OrderTotal = sample(1:100, 1000, replace = TRUE))

出力は次のようになります。

head(products)
  clientID  OrderDate category numProducts OrderTotal
1       90 2012-03-20        D           9         18
2       66 2012-08-19        A           3         50
3       45 2012-05-25        A          10         75
4       28 2012-01-01        D           4         27
5       71 2012-02-28        A           4         76
6       26 2012-01-28        C           8         89

私が取得しようとしている構造は、次のようになります。

          Category A                                                                    ...   Category E
ClientID  Jan2012numProducts  Jan2012OrderTotal  Feb2012numProducts  Feb2012OrderTotal  ...  Sep2012numProducts  Sep2012OrderTotal
1         12                  78                 6                   52                      0                   0
2         7                   218                3                   15                      1                   28
...
99999     20                  192                10                  100                     28                  156

列名はおそらく長くなり、AJan2012numProducts や AJan2012OrderTotal のようになりますが、それで問題ありません。

ここに私が不明な手順があります - 繰り返しますが、ドキュメントやビネットで参照されている手順を見つけることができません:

1)zoo複数の観測フィールドの集計はできますか? この場合、当月の numProducts と OrderTotal の合計を同時に取得したいと考えています。zooできなくても、merge関数を使用して clientID とカテゴリに参加 できます

2) zoo1 つの要因 (または複数の要因) でグループ化して集計を実行できますか? clientID とカテゴリを月ごとに見られるようにしたいです。

3) X 軸に沿ってカテゴリと月を含むデータフレームを作成する機能はありますか。そうでない場合、時系列データを clientID とカテゴリで単純にグループ化できれば、 を使用reshapeして時系列を広くすることができますcast。データフレームをこの構造に入れる必要があります。

head(df)
clientID   Month     category    numProducts  OrderTotal
1        2012-01-31  A           12           78
1        2012-01-31  B           0            0
....
99999    2012-09-30  D           6            71
99999    2012-09-30  E           1            28



cast(df, month~category, sum) (or something close to that)

これは可能ですか?いくつかの例を教えていただけますか?

4

1 に答える 1

0

format.Datextabs、およびを組み合わせて使用​​することでftable、求めるものをほぼ正確に得ることができます。例を少し短くしましたが、原則は明らかです。month-field を短くしたい場合は、table-object のディメンションの名前を変更するか、month-column を作成してすべての作業をやり直すことができます。(「動物園」がどのようにこの図に入るかを理解するのに苦労したことは認めます。現時点では単純な集計の問題のように見えますが...aggregate.zoo複数の基準で集計し、合計を集計として使用できると確信しています関数。)

最初に 2 つのコマンド、次にコンソール セッションの出力:

prodtble <- xtabs(cbind(numProducts, OrderTotal) ~ clientID + 
                                                  format(OrderDate, "%b%Y") + 
                                                  category, 
                  data=products)
ftable(prodtbl, row.vars=c("category","clientID"))

出力は次のとおりです。

> xtabs(cbind(numProducts, OrderTotal) ~ clientID + format(OrderDate, "%b%Y")+category, data=products)
, , category = A,  = numProducts

        format(OrderDate, "%b%Y")
clientID Feb2012 Jan2012 Mar2012
       1      23       0      16
       2       0       6      27
       3      30       0      21
       4      13      33      24
       5       5      20      12

, , category = B,  = numProducts

        format(OrderDate, "%b%Y")
clientID Feb2012 Jan2012 Mar2012
       1       8      27      23
       2       8      14       4
       3       0       5       6
       4       8      13      39
       5       3      23       9

, , category = C,  = numProducts

        format(OrderDate, "%b%Y")
clientID Feb2012 Jan2012 Mar2012
       1       0       6      20
       2      20      20       4
       3       0      17       0
       4      17      11       2
       5       7       3       8

, , category = A,  = OrderTotal

        format(OrderDate, "%b%Y")
clientID Feb2012 Jan2012 Mar2012
       1      40       0      41
       2       0       5      33
       3      48       0      40
       4      16      28      24
       5      23      42      29

, , category = B,  = OrderTotal

        format(OrderDate, "%b%Y")
clientID Feb2012 Jan2012 Mar2012
       1      14      24      19
       2      22      19      19
       3       0       2       4
       4      19      46      62
       5      10      38      10

, , category = C,  = OrderTotal

        format(OrderDate, "%b%Y")
clientID Feb2012 Jan2012 Mar2012
       1       0       2      39
       2      30      33       7
       3       0      44       0
       4      50      21      19
       5      16      14      28
# You could have skipped the printout by assigning to 'prodtable' in the step above.
# I thought is was useful pedagogically.

> prodtbl <- .Last.value

> ftable(prodtbl, row.vars=c("category","clientID"))
                  format(OrderDate, "%b%Y")     Feb2012                Jan2012                Mar2012           
                                            numProducts OrderTotal numProducts OrderTotal numProducts OrderTotal
category clientID                                                                                               
A        1                                           23         40           0          0          16         41
         2                                            0          0           6          5          27         33
         3                                           30         48           0          0          21         40
         4                                           13         16          33         28          24         24
         5                                            5         23          20         42          12         29
B        1                                            8         14          27         24          23         19
         2                                            8         22          14         19           4         19
         3                                            0          0           5          2           6          4
         4                                            8         19          13         46          39         62
         5                                            3         10          23         38           9         10
C        1                                            0          0           6          2          20         39
         2                                           20         30          20         33           4          7
         3                                            0          0          17         44           0          0
         4                                           17         50          11         21           2         19
         5                                            7         16           3         14           8         28

これは短縮された例です:

clients <- 1:5
dates <- seq(as.Date("2012/1/1"), as.Date("2012/3/31"), "days")
categories <- LETTERS[1:3]
products <- data.frame(clientID = sample(clients, 100, replace = TRUE), 
                       OrderDate = sample(dates, 100, replace = TRUE), 
                       category = sample(categories, 100, replace = TRUE),
                       numProducts = sample(1:10, 100, replace = TRUE), 
                       OrderTotal = sample(1:20, 100, replace = TRUE))
于 2012-09-07T15:12:11.310 に答える