在R中对多个变量进行分组

时间:2011-10-09 17:49:29

标签: excel r pivot-table plyr

我是一个强大的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

希望按照访问次数和帖子分组达到一定级别,然后将高于50的任何内容分组为“> 51'

作为实现这一目标的方法,我看起来很轻松,但我认为它们不会像我期望的那样工作,但我可能错了。

最后,我知道我可以在SQL中使用和if / then语句来识别访问范围和帖子范围(例如 - 如果访问1到10之间,那么'1-10'),那么只是按访问范围和后期范围分组,但我的目标是开始强迫自己使用R.也许R不是正确的工具,但我认为它是......

所有帮助将不胜感激。提前致谢。

1 个答案:

答案 0 :(得分:6)

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)

最后,将ddplysummarise

一起使用
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