2011-10-09 153 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