2012-03-08 2472 views
17

這是一個簡單的問題,但我不知道如何使用prop.table爲此,我非常需要此功能。在R中,如何計算數據框中列的百分比統計信息? (表函數擴展百分比)

我有這樣

> library(ggplot2) 
> #sample data 
> head(tips,3) 
    total_bill tip sex smoker day time size 
1   17 1.0 Female  No Sun Dinner 2 
2   10 1.7 Male  No Sun Dinner 3 
3   21 3.5 Male  No Sun Dinner 3 
> #how often there is a non-smoker 
> table(tips$smoker) 

No Yes 
151 93 
> #how many subjects 
> nrow(tips) 
[1] 244 

數據,我需要知道的吸菸者與非吸菸者的比例 像這樣的東西(醜陋的代碼):

> #percentage of smokers 
> options(digits=2) 
> transform(as.data.frame(table(tips$smoker)),percentage_column=Freq/nrow(tips)*100) 
    Var1 Freq percentage_column 
1 No 151    62 
2 Yes 93    38 
> 

是否有更好的辦法做這個?

(甚至更好它會做到這一點的一組列(我列舉的),並具有輸出有些很好的格式化) (如吸菸,日和時間)

+0

祕訣是GGPLOT2包 – userJT 2012-03-08 22:07:35

回答

42

如果它的簡潔你後,你可能會喜歡:

prop.table(table(tips$smoker)) 

,然後通過100的規模和全面,如果你喜歡。還是更喜歡你確切的輸出:

tbl <- table(tips$smoker) 
cbind(tbl,prop.table(tbl)) 

如果您想爲多列做到這一點,有很多不同的方向,你可以根據你的是你的口味告訴乾淨尋找輸出,但這裏有一個選項去的:

tblFun <- function(x){ 
    tbl <- table(x) 
    res <- cbind(tbl,round(prop.table(tbl)*100,2)) 
    colnames(res) <- c('Count','Percentage') 
    res 
} 

do.call(rbind,lapply(tips[3:6],tblFun)) 
     Count Percentage 
Female 87  35.66 
Male  157  64.34 
No  151  61.89 
Yes  93  38.11 
Fri  19  7.79 
Sat  87  35.66 
Sun  76  31.15 
Thur  62  25.41 
Dinner 176  72.13 
Lunch  68  27.87 

如果你不喜歡堆疊在彼此頂部的不同的表,你可以溝do.call,並讓它們在列表中。

+0

嗯..我沒有想到的「鏈接」表和prop.table像內的數據集那。 如何爲多個枚舉列做...? – userJT 2012-03-08 22:10:11

+0

@ user56用一個可能的例子進行編輯(但有許多不同的方法來處理您描述的內容)。 – joran 2012-03-08 22:18:19

+0

可以dplyr添加這樣的功能(我們都一直在使用它) – userJT 2016-03-01 14:33:42

9

您的代碼不看起來對我來說太難看了......
然而,一個替代方案(不是更好)可能是例如:

df <- data.frame(table(yn)) 
colnames(df) <- c('Smoker','Freq') 
df$Perc <- df$Freq/sum(df$Freq) * 100 

------------------ 
    Smoker Freq Perc 
1  No 19 47.5 
2 Yes 21 52.5 
4

我不是100%確定的,但我認爲這是做你想用prop.table。主要看最後3行。其餘的代碼只是創建假數據。

set.seed(1234) 

total_bill <- rnorm(50, 25, 3) 
tip <- 0.15 * total_bill + rnorm(50, 0, 1) 
sex <- rbinom(50, 1, 0.5) 
smoker <- rbinom(50, 1, 0.3) 
day <- ceiling(runif(50, 0,7)) 
time <- ceiling(runif(50, 0,3)) 
size <- 1 + rpois(50, 2) 
my.data <- as.data.frame(cbind(total_bill, tip, sex, smoker, day, time, size)) 
my.data 

my.table <- table(my.data$smoker) 

my.prop <- prop.table(my.table) 

cbind(my.table, my.prop) 
0

我做這個做聚合函數時和類似

per.fun <- function(x) { 
    if(length(x)>1){ 
     denom <- length(x); 
     num <- sum(x); 
     percentage <- num/denom; 
     percentage*100 
     } 
     else NA 
    }