R надлъжни данни - Групиране по множество фактори

Все още се опитвам да създам подробна рамка от данни за времеви серии. Опитвам се да получа месечни данни за множество точки от данни, след което да ги групирам по множество фактори. Не съм сигурен, че това е възможно, тъй като не съм виждал подобен пример в документацията, винетките или на 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) Може ли zoo да групира по фактор (или множество фактори), за да извърши агрегирането? Искам да мога да разглеждам 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)

Възможно ли е нещо от това? Бихте ли помогнали с някои примери?


person mikebmassey    schedule 07.09.2012    source източник


Отговори (1)


Комбинацията от използване на format.Date, xtabs и ftable ви дава почти точно това, което искате. Малко съкратих примера, но принципът трябва да е ясен. Ако искате полето за месец да е по-кратко, можете да промените името на измерението в обекта на таблицата или можете да направите колона за месец и да повторите цялата работа с това. (Признавам, че имах проблеми да разбера как „зоологическата градина“ ще влезе в тази картина. В момента изглежда като прост проблем с табличната таблица. Въпреки че ... Сигурен съм, че aggregate.zoo е в състояние да агрегира по множество критерии и да използва сумата като агрегираща функция.)

Първо двете команди, след това изход от конзолна сесия:

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))
person IRTFM    schedule 07.09.2012
comment
Благодаря за това. Не съм сигурен дали форматирането на SO ме обърква или не - мога да накарам реда xtabs да се изпълнява, но част от , , category = A, = numProducts не работи за мен. Как трябва да се въведе това? След xtabs като последващи команди? - person mikebmassey; 07.09.2012
comment
Само редовете, започващи с › са команди; другите редове се извеждат. - person IRTFM; 07.09.2012