我是一个强大的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不是正确的工具,但我认为它是......
所有帮助将不胜感激。提前致谢。
答案 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)
最后,将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