【问题标题】:Grouping on multiple variables in R在 R 中对多个变量进行分组
【发布时间】:2011-10-09 17:49:29
【问题描述】:

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

我已经将 tapply 和 ddply 视为实现此目的的方法,但我认为它们不会按我预期的方式工作,但我可能错了。

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

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

【问题讨论】:

  • 欢迎来到 SO。愿您早日摆脱对 Excel 的依赖。 (它对我有用!现在我只能在胁迫下使用 Excel……)
  • 谢谢。我从多年的使用中非常了解 excel,但我也读过 R 只会在分析方面吸烟。这是真的,对吧?

标签: excel r pivot-table plyr


【解决方案1】:

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

【讨论】:

  • 这非常有帮助。感谢您的回答和示例。我遇到麻烦的一个领域是在运行“dat$PostRange
  • @mikebmassey 您可以通过两种方式使用cut:指定切割数,或指定切割点(可以是整数)。您还可以指定文本标签来描述间隔。最后,请记住,科学记数法只是数字的表示。您可以随时使用format 打印漂亮的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多