Группировка по нескольким переменным в R - PullRequest
4 голосов
/ 09 октября 2011

Я - пользователь сводных таблиц Power Excel, который заставляет себя изучать R. Я точно знаю, как выполнить этот анализ в Excel, но не могу найти правильный способ кодировать это в R.

Я пытаюсь сгруппировать пользовательские данные по 2 различным переменным, группируя переменные в диапазоны (или ячейки), а затем суммируя другие переменные.

Вот как выглядят данные:

userid  visits  posts   revenue
1       25      0       25
2       2       2       0
3       86      7       8
4       128     24      94
5       30      5       18
…       …       …        …
280000  80      10      100
280001  42      4       25
280002  31      8       17

Вот то, что я пытаюсь, чтобы результат выглядел так:

VisitRange  PostRange   # of Users  Total Revenue   Average Revenue
0           0           X            Y              Z
1-10        0           X   Y   Z
11-20       0           X   Y   Z
21-30       0           X   Y   Z
31-40       0           X   Y   Z
41-50       0           X   Y   Z
> 50        0           X   Y   Z
0           1-10        X            Y              Z
1-10        1-10        X            Y              Z
11-20       1-10        X            Y              Z
21-30       1-10        X            Y              Z
31-40       1-10        X            Y              Z
41-50       1-10        X            Y              Z
> 50        1-10        X            Y              Z

хочу сгруппировать попосещений и публикаций от 10 до определенного уровня, затем сгруппировать все, что выше 50, как '> 51'

Я выглядел непристойно и неуклюже, как способы достичь этого, но я не думаю, что они будутработать так, как я ожидаю, но я могу ошибаться.

Наконец, я знаю, что мог бы сделать это в SQL, используя оператор if / then, чтобы определить диапазон посещений и диапазон сообщений (например, - если посещения между 1 и 10, то «1-10»), затем просто сгруппируйте по диапазону посещений и диапазону публикаций, но моя цель здесь состоит в том, чтобы заставить себя использовать R. Возможно, R здесь не тот инструмент, но я думаю, что это…

Вся помощь будетбыть оцененнымЗаранее спасибо.

1 Ответ

6 голосов
/ 09 октября 2011

Идиома в пакете plyr и ddply, в частности, очень похожа на сводные таблицы в Excel.

В вашем примере единственное, что вам нужно сделать, это cut ваши переменные группировки в желаемые разрывы, прежде чем перейти к ddply. Вот пример:

Сначала создайте пример данных:

set.seed(1)
dat <- data.frame(
  userid = 1:500,
  visits =sample(0:50, 500, replace=TRUE),
  posts = sample(0:50, 500, replace=TRUE),
  revenue = sample(1:100, replace=TRUE)
  )

Теперь используйте cut, чтобы разделить переменные группировки на нужные диапазоны:

dat$PostRange <- cut(dat$posts, breaks=seq(0, 50, 10), include.lowest=TRUE)
dat$VisitRange <- cut(dat$visits, breaks=seq(0, 50, 10), include.lowest=TRUE)

Наконец, используйте ddply с summarise:

library(plyr)
ddply(dat, .(VisitRange, PostRange), 
      summarise, 
      Users=length(userid), 
      `Total Revenue`=sum(revenue), 
      `Average Revenue`=mean(revenue))

Результаты:

   VisitRange PostRange Users Total Revenue Average Revenue
1      [0,10]    [0,10]    23          1318        57.30435
2      [0,10]   (10,20]    23          1136        49.39130
3      [0,10]   (20,30]    28          1499        53.53571
4      [0,10]   (30,40]    20           923        46.15000
5      [0,10]   (40,50]    14           826        59.00000
6     (10,20]    [0,10]    23          1227        53.34783
7     (10,20]   (10,20]    17           642        37.76471
8     (10,20]   (20,30]    20           888        44.40000
9     (10,20]   (30,40]    15           622        41.46667
10    (10,20]   (40,50]    21           968        46.09524
11    (20,30]    [0,10]    23          1226        53.30435
12    (20,30]   (10,20]    19          1021        53.73684
13    (20,30]   (20,30]    23          1380        60.00000
14    (20,30]   (30,40]     8           313        39.12500
15    (20,30]   (40,50]    19           710        37.36842
16    (30,40]    [0,10]    18           782        43.44444
17    (30,40]   (10,20]    25          1308        52.32000
18    (30,40]   (20,30]    14           553        39.50000
19    (30,40]   (30,40]    26          1131        43.50000
20    (30,40]   (40,50]    20          1295        64.75000
21    (40,50]    [0,10]    20           958        47.90000
22    (40,50]   (10,20]    21          1168        55.61905
23    (40,50]   (20,30]    20          1118        55.90000
24    (40,50]   (30,40]    20          1009        50.45000
25    (40,50]   (40,50]    20           934        46.70000
...