2016-01-04 39 views
4

我正在嘗試創建一個表,其中彙總了另一個變量的幾個分類變量(使用頻率和比例)。我想用dplyr軟件包來做這件事。使用dplyr創建具有多個分類/因子變量的彙總比例表

這些先前堆棧溢出討論部分我正在尋找: Relative frequencies/proportions with dplyrCalculate relative frequency for a certain group

使用mtcars數據集,這是輸出將是什麼樣子,如果我只是想通過am類別來看待gear比例:

mtcars %>% 
    group_by(am, gear) %>% 
    summarise (n = n()) %>% 
    mutate(freq = n/sum(n)) 

    # am gear n  freq 
    # 1 0 3 15 0.7894737 
    # 2 0 4 4 0.2105263 
    # 3 1 4 8 0.6153846 
    # 4 1 5 5 0.3846154 

不過,其實我是想看看,不僅gears,am,carb,amcyl,am,分別在同一表中。如果我修改代碼:

mtcars %>% 
    group_by (am, gear, carb, cyl) %>% 
    summarise (n = n()) %>% 
    mutate(freq = n/sum(n)) 

我得到的頻率的amgearcarbcyl每個組合。這不是我想要的。有沒有辦法與dplyr做到這一點?

編輯

而且,這將是一個額外的獎金,如果有人知道的方式來產生我想要的表,但隨着am類別的列(如傳統的2x2的表格式) 。這是我所指的一個例子。這是我之前的一篇出版物。我想產生讀該表,讓我可以使用RMarkdown直接輸出到Word文檔:解決這個

enter image description here

+0

是否有必須在dplyr中完成的原因?並且是「團體」之一總是一樣的? (這裏是'am') – Heroka

+0

你可以舉一個你想要的表格的例子嗎?對於一些重塑,這當然是可能的,但我不確定你在做什麼。 – Heroka

+0

有沒有超級重要的原因,它必須在dplyr中完成,除了我試圖很好地學習包,以便我有一個一致的方法可用於生成我的表。 dplyr的另一個驅動原因是它產生一個數據幀作爲輸出,這使我可以使用stargazer包生成出版物,然後使用RMarkdown將其輸出到Word文檔。當然,我會接受其他人認爲更好的替代方法。 – RNB

回答

4

隨着tidyr/dplyr組合,這裏是你會怎麼做:

library(tidyr) 
library(dplyr) 

mtcars %>% 
    gather(variable, value, gear, carb, cyl) %>% 
    group_by(am, variable, value) %>% 
    summarise (n = n()) %>% 
    mutate(freq = n/sum(n)) 
5

的一種方法,是將數據變成一個長(ER)格式。然後,您可以使用相同的代碼來計算出你想要的結果,有一個額外的GROUP_BY:

library(reshape2) 
library(dplyr) 

m_mtcars <- melt(mtcars,measure.vars=c("gear","carb","cyl")) 

res <- m_mtcars %>% 
    group_by(am, variable, value) %>% 
    summarise (n = n()) %>% 
    mutate(freq = n/sum(n)) 

大廈這一點,可以使用更多的整形和一些字符串格式化來獲得所需的輸出

#make an 'export' variable 
res$export <- with(res, sprintf("%i (%.1f%%)", n, freq*100)) 

#reshape again 
output <- dcast(variable+value~am, value.var="export", data=res, fill="missing") #use drop=F to prevent silent missings 
#'silent missings' 
output$variable <- as.character(output$variable) 
#make 'empty lines' 
empties <- data.frame(variable=unique(output$variable), stringsAsFactors=F) 
empties[,colnames(output)[-1]] <- "" 

#bind them together 
output2 <- rbind(empties,output) 
output2 <- output2[order(output2$variable,output2$value),] 

#optional: 'remove' variable if value present 

output2$variable[output2$value!=""] <- "" 

這導致:

variable value   0   1 
2  carb       
7    1 3 (15.8%) 4 (30.8%) 
8    2 6 (31.6%) 4 (30.8%) 
9    3 3 (15.8%) missing 
10    4 7 (36.8%) 3 (23.1%) 
11    6 missing 1 (7.7%) 
12    8 missing 1 (7.7%) 
3  cyl       
13    4 3 (15.8%) 8 (61.5%) 
14    6 4 (21.1%) 3 (23.1%) 
15    8 12 (63.2%) 2 (15.4%) 
1  gear       
4    3 15 (78.9%) missing 
5    4 4 (21.1%) 8 (61.5%) 
6    5 missing 5 (38.5%) 
+1

如果您使用'dplyr',另一個選項是'tidyr'的'gather'並且連接'%>%' – akrun