2013-08-05 87 views
5

我在使用plyr軟件包中的ddply函數時遇到了一些麻煩。我試圖用每個組內的計數和比例來總結以下數據。這是我的數據:ddply總結比例計數

structure(list(X5employf = structure(c(1L, 3L, 1L, 1L, 1L, 3L, 
1L, 1L, 1L, 3L, 1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 1L, 2L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 1L, 1L, 3L, 1L, 
3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 
3L, 3L, 1L), .Label = c("increase", "decrease", "same"), class = "factor"), 
    X5employff = structure(c(2L, 6L, NA, 2L, 4L, 6L, 5L, 2L, 
    2L, 8L, 2L, 2L, 2L, 7L, 7L, 8L, 11L, 7L, 2L, 8L, 8L, 11L, 
    7L, 6L, 2L, 5L, 2L, 8L, 7L, 7L, 7L, 8L, 6L, 7L, 5L, 5L, 7L, 
    2L, 6L, 7L, 2L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 2L, 5L, 2L, 2L, 
    2L, 5L, 12L, 2L, 2L, 2L, 2L, 5L, 5L, 5L, 5L, 2L, 5L, 2L, 
    13L, 9L, 9L, 9L, 7L, 8L, 5L), .Label = c("", "1", "1 and 8", 
    "2", "3", "4", "5", "6", "6 and 7", "6 and 7 ", "7", "8", 
    "1 and 8"), class = "factor")), .Names = c("X5employf", "X5employff" 
), row.names = c(NA, 73L), class = "data.frame") 

,這裏是使用ddply我的電話:

ddply(kano_final, .(X5employf, X5employff), summarise, n=length(X5employff), prop=(n/sum(n))*100) 

這給我的X5employff正確每個實例的數量,但卻彷彿比例正在跨越每行計算似乎而不是內的因子X5employf的每個級別如下:

X5employf X5employff n prop 
1 increase   1 26 100 
2 increase   2 1 100 
3 increase   3 15 100 
4 increase 1 and 8 1 100 
5 increase  <NA> 1 100 
6 decrease   4 1 100 
7 decrease   5 5 100 
8 decrease   6 2 100 
9 decrease   7 1 100 
10 decrease   8 1 100 
11  same   4 4 100 
12  same   5 6 100 
13  same   6 5 100 
14  same 6 and 7 3 100 
15  same   7 1 100 

當手動計算各組我得到這個內的比例:

X5employf X5employff n prop 
1 increase   1 26 59.09 
2 increase   2 1 2.27 
3 increase   3 15 34.09 
4 increase 1 and 8 1 2.27 
5 increase  <NA> 1 2.27 
6 decrease   4 1 10.00 
7 decrease   5 5 50.00 
8 decrease   6 2 20.00 
9 decrease   7 1 10.00 
10 decrease   8 1 10.00 
11  same   4 4 21.05 
12  same   5 6 31.57 
13  same   6 5 26.31 
14  same 6 and 7 3 15.78 
15  same   7 1 5.26 

正如你所看到的因素X5employf的每個級別的比例之和等於100

我知道這可能是可笑的簡單,但我似乎無法讀取,儘管讓我的頭周圍各種類似的帖子。任何人都可以幫助我理解總結功能的工作原理嗎?!

很多,非常感謝

馬蒂

+0

事實證明,'總和(N)'不被計算爲所需 – Metrics

回答

6

因爲什麼被傳遞到每個summarize呼叫你不能做到這一點在一個ddply調用您的數據爲您的組變量的特定組合的一個子集。在此最低級別,您無權訪問該中間級別sum(n)。相反,這樣做在兩個步驟:

kano_final <- ddply(kano_final, .(X5employf), transform, 
        sum.n = length(X5employf)) 

ddply(kano_final, .(X5employf, X5employff), summarise, 
     n = length(X5employff), prop = n/sum.n[1] * 100) 

編輯:使用單一ddply通話,並使用table你暗示走向:

ddply(kano_final, .(X5employf), summarise, 
     n   = Filter(function(x) x > 0, table(X5employff, useNA = "ifany")), 
     prop  = 100* prop.table(n), 
     X5employff = names(n)) 
+0

感謝flodel,這正是我想要的。無論如何將這個結合到一個單一的電話?我試圖總結一個相當大的數據集,並試圖達到一個點,我可以爲此編寫一個腳本,所以在每種情況下,我只需輸入一個分組變量和一個「測量」變量,就像這個例子一樣計算數據集內組的置信區間:http://www.cookbook-r.com/Manipulating_data/Summarizing_data/ –

+0

哦,仍然不完全確定'transform'和'summarize'之間的區別!? –

+0

'transform'增加了你數據的每一行(就像'ave'函數那樣),而'summarize'會聚合你的數據(就像''aggregate'函數那樣)。 – flodel

0

你顯然希望做的是找出每個X5employf值的X5employff比例。但是,您不會明白地告訴X5employf和X5employff是不同的;到ddply,這兩個變量只是分解數據的兩個變量。另外,由於每行有一個觀察值,即對於每行數據count = 1,每個(X5employf,X5employff)組合的長度等於每個(X5employf,X5employff)組合的總和。

最簡單的「plyr的方式」來解決,我能想到的你的問題如下:

result <- ddply(kano_final, .(X5employf, X5employff), summarise, n=length(X5employff), drop=FALSE) 
n <- result$n 
n2 <- ddply(kano_final, .(X5employf), summarise, n=length(X5employff))$n 
result <- data.frame(result, prop=n/rep(n2, each=13)*100) 

你也可以使用好老XTABS:

a <- xtabs(~X5employf + X5employff, kano_final) 
b <- xtabs(~X5employf, kano_final) 
a/matrix(b, nrow=3, ncol=ncol(a)) 
+0

你的plyr解決方案和@ flodel有什麼區別? – Metrics

+0

我看到的一個區別是我不使用硬編碼的'each = 13'。這不會一般化... – flodel

+0

謝謝,這讓我更加接近理解發生了什麼。我發現這似乎更簡單,但我真的不明白髮生了什麼:'df.new <-ddply(kano_final,。(X5employf),summary, prop = prop.table(table(X5employff)), X5employff = names(table(X5employff)))'雖然...似乎工作,但不會添加'count'列。我應該提到所有這一切背後的原因是,我可以使用ggplot2或類似的方法繪製結果的頻率計數或頻率百分比條形圖... –

1

我想在這裏補充dplyr的一個例子使得它可以在一個步驟中輕鬆完成,並且具有短代碼和易於閱讀的語法。

d是您的數據。框架

library(dplyr) 
d%.% 
    dplyr:::group_by(X5employf, X5employff) %.% 
    dplyr:::summarise(n = length(X5employff)) %.% 
    dplyr:::mutate(ngr = sum(n)) %.% 
    dplyr:::mutate(prop = n/ngr*100) 

將導致

Source: local data frame [15 x 5] 
Groups: X5employf 

    X5employf X5employff n ngr  prop 
1 increase   1 26 44 59.090909 
2 increase   2 1 44 2.272727 
3 increase   3 15 44 34.090909 
4 increase 1 and 8 1 44 2.272727 
5 increase   NA 1 44 2.272727 
6 decrease   4 1 10 10.000000 
7 decrease   5 5 10 50.000000 
8 decrease   6 2 10 20.000000 
9 decrease   7 1 10 10.000000 
10 decrease   8 1 10 10.000000 
11  same   4 4 19 21.052632 
12  same   5 6 19 31.578947 
13  same   6 5 19 26.315789 
14  same 6 and 7 3 19 15.789474 
15  same   7 1 19 5.263158