这是一个简单的问题,但我无法弄清楚如何使用prop.table,因此我非常经常需要此功能。
我有这样的数据
> library(ggplot2)
> #sample data(tips is a dataset within the ggplot2 package)
> 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
>
有更好的方法吗?
((最好是在一组列上进行此操作(我列举),并以某种格式正确地输出)(例如,吸烟者,日期和时间)
如果您追求的简洁,您可能会喜欢:
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
并将它们放在列表中。
您的代码对我来说似乎并不那么丑...然而,另一种选择(不是更好)可能是:
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
我不确定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)
我在做聚合函数和类似的时候是这样做的>>
per.fun <- function(x) {
if(length(x)>1){
denom <- length(x);
num <- sum(x);
percentage <- num/denom;
percentage*100
}
else NA
}
这里是整齐的版本: