2013-02-08 134 views
2

我想獲取以下數據,然後使用這些數據創建一個表,其中包含按狀態細分的信息。總結一個數據幀

這裏的數據:

> head(mydf2, 10) 
    lead_id buyer_account_id amount state 
1 52055267    62 300 CA 
2 52055267    64 264 CA 
3 52055305    64 152 CA 
4 52057682    62  75 NJ 
5 52060519    62 750 OR 
6 52060519    64 574 OR 
15 52065951    64 152 TN 
17 52066749    62 600 CO 
18 52062751    64 167 OR 
20 52071186    64 925 MN 

我媒體鏈接子集,我很感興趣,和剛纔我感興趣的數據狀態:

mydf2 = subset(mydf, state %in% c("NV","AL","OR","CO","TN","SC","MN","NJ","KY","CA")) 

這裏有一個想法我在找什麼:

State  Amount  Count 
NV  1    50 
NV  2    35 
NV  3    20 
NV  4    15 
AL  1    10 
AL  2    6 
AL  3    4 
AL  4    1 
... 

對於每個州,我試圖找到每個數量「級別」的計數。我沒有必要需要組數量可變的,但要記住,他們不只是1,2,3等

> mydf$amount 
    [1] 300 264 152 75 750 574 113 152 750 152 675 489 188 263 152 152 600 167 34 925 375 156 675 152 488 204 152 152 
    [29] 600 489 488 75 152 152 489 222 563 215 452 152 152 75 100 113 152 150 152 150 152 452 150 152 152 225 600 620 
    [57] 113 152 150 152 152 152 152 152 152 152 640 236 152 480 152 152 200 152 560 152 240 222 152 152 120 257 152 400 

是否有R表示此一個優雅的解決這個或將我被卡住使用Excel(yuck!)。

+2

你看過'表'嗎? – A5C1D2H2I1M1N2O1R2T1 2013-02-08 17:19:17

+0

你能解釋一下你的意思嗎?「我不需要對數量變量進行分組,但是請記住它們不僅僅是1,2,3等。」 – A5C1D2H2I1M1N2O1R2T1 2013-02-08 17:25:14

+0

對於這個例子,我使用了1,2,3等,但實際上有很多數量值。我正是這個意思。 – ATMathew 2013-02-08 17:32:27

回答

3

我不知道我是否理解正確(您有兩個data.framesmydfmydf2)。我假設你的數據在mydf。使用aggregate

mydf$count <- 1:nrow(mydf) 
aggregate(data = mydf, count ~ amount + state, length) 

這是你在找什麼?

注意:這裏的count是創建一個變量,直接得到第三列的輸出爲count

替代與ddplyplyr

# no need to create a variable called count 
ddply(mydf, .(state, amount), summarise, count=length(lead_id)) 

這裏有一個可以使用存在於一個人的數據,而不是lead_id任何列。即使state

ddply(mydf, .(state, amount), summarise, count=length(state)) 

或等價不使用總結:

ddply(mydf, .(state, amount), function(x) c(count=nrow(x))) 
+0

這正是我所期待的。謝謝! – ATMathew 2013-02-08 17:51:45

+0

如果沒有引用「lead_id」,我得到eval中的錯誤(expr,envir,enclos):找不到對象'lead_id'。你可以用我的玩具例子來試試它,看看它是否按預期爲你工作?同樣在玩具的例子中,「聚合」的時鐘速度比「ddply」快25倍。也可以直接在count中加入count('aggregate(data = mydf,1:nrow(mydf)〜amount + state,length)'),但是你必須清理結果變量名。 – A5C1D2H2I1M1N2O1R2T1 2013-02-08 18:12:14

+0

@Arun,oops;)任何想法爲什麼輸入它作爲引用的作品? – A5C1D2H2I1M1N2O1R2T1 2013-02-08 18:22:37

4

這裏是我的,你正在試圖做什麼的認識:

開始用一個簡單的data.frame與26個國家和只佔範圍從1到50(比範例中的範圍要高得多)。

set.seed(1) 
mydf <- data.frame(
    state = sample(letters, 500, replace = TRUE), 
    amount = sample(1:50, 500, replace = TRUE) 
) 

head(mydf) 
# state amount 
# 1  g  28 
# 2  j  35 
# 3  o  33 
# 4  x  34 
# 5  f  24 
# 6  x  49 

下面是一些簡單的列表。我還刪除了頻率等於零的任何實例,並且我按狀態對輸出進行了重新排序。

temp1 <- data.frame(table(mydf$state, mydf$amount)) 
temp1 <- temp1[!temp1$Freq == 0, ] 
head(temp1[order(temp1$Var1), ]) 
#  Var1 Var2 Freq 
# 79  a 4 1 
# 157  a 7 2 
# 391  a 16 1 
# 417  a 17 1 
# 521  a 21 1 
# 1041 a 41 1 
dim(temp1) # How many rows/cols 
# [1] 410 3 

這是一個有點不同的製表。我們在分組「數量」值之後列表。在這裏,我已經手動指定了休息時間,但是您可以輕鬆地讓R決定最好的想法。

temp2 <- data.frame(table(mydf$state, 
          cut(mydf$amount, 
           breaks = c(0, 12.5, 25, 37.5, 50), 
           include.lowest = TRUE))) 
temp2 <- temp2[!temp2$Freq == 0, ] 
head(temp2[order(temp2$Var1), ]) 
# Var1  Var2 Freq 
# 1  a [0,12.5] 3 
# 27 a (12.5,25] 3 
# 79 a (37.5,50] 3 
# 2  b [0,12.5] 2 
# 28 b (12.5,25] 6 
# 54 b (25,37.5] 5 
dim(temp2) 
# [1] 103 3