在R中的多个variables上分组

我是一个强大的Excel数据透视表用户谁是强迫自己学习R我确切地知道如何在Excel中做这个分析,但不能找出正确的方式来编码在R.

我试图将用户数据按2个不同的variables进行分组,然后将这些variables分组到不同的范围(或箱)中,然后汇总其他variables。

这里是数据的样子:

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 XYZ 1-10 0 XYZ 11-20 0 XYZ 21-30 0 XYZ 31-40 0 XYZ 41-50 0 XYZ > 50 0 XYZ 0 1-10 XYZ 1-10 1-10 XYZ 11-20 1-10 XYZ 21-30 1-10 XYZ 31-40 1-10 XYZ 41-50 1-10 XYZ > 50 1-10 XYZ 

希望按访问和post进行分组,最多可以达到一定的水平,

我已经看到了一种方法来实现这一点,但我不认为他们会像我期望的那样工作,但我可能是错的。

最后,我知道我可以在SQL中使用if和then声明来确定访问的范围和post的范围(例如,如果访问次数在1到10之间,则为1-10),然后按访问范围和职位范围,但我的目标是开始强迫自己使用R.也许R不是这里的正确工具,但我认为这是…

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

plyr软件包和ddply中的习惯用法与Excel中的数据透视表非常相似。

在你的例子中,你需要做的唯一事情就是在传递给ddply之前, cut你的分组variablescut成想要的分组。 这里是一个例子:

首先,创build一些示例数据:

 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将你的分组variables分成所需的范围:

 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