2011-10-09 88 views
4

我是一个强大的Excel数据透视表用户,他强迫自己学习R.我完全知道如何在Excel中做这种分析,但无法弄清楚正确的方式来编码R.在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 

这里就是我试图让输出看起来像:10达

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在这里不是正确的工具,但我认为它是...

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

+0

欢迎来到SO。你可能很快就会从你对Excel的沉迷中得到治愈。 (它对我有用!现在我只能在胁迫下使用Excel ...) – Andrie

+0

谢谢。我从多年的使用中知道得非常出色,但我也已经读过,R将会在分析方面吸取它。这是真的,对吗? – mikebmassey

回答

6

plyr包中的成语和ddply尤其与Excel中的数据透视表非常相似。

在你的例子中,你需要做的唯一的事情就是将你的分组变量分组到所需的分组中,然后传递给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)) 

re sults:

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 
+0

这非常有帮助。感谢您的答案和例子。我碰到麻烦的一个区域是运行“dat $ PostRange < - cut(dat $ posts,breaks = seq(0,50,10),include.lowest = TRUE)” - 我试图“中断“至少6位数加2位小数(999999.00)。当我运行该功能时,即使我关闭了sci符号,它也会将数据“剪切”成科学记数法。有没有办法强制它的整数/实数?再次感谢。 – mikebmassey

+0

@mikebmassey您可以通过两种方式使用'cut':指定切割次数或指定切割点(可以是整数)。您还可以指定文本标签来描述间隔。最后,请记住,科学记数法只是数字的表示。你总是可以使用格式来打印漂亮的数字。 – Andrie