如何计算R中答案的频率?

时间:2014-05-16 15:00:08

标签: r crosstab

我有一个看起来像这样的数据库:

ID Group Drink
1   A      yes
2   A      no
3   A      NA
4   B      no
5   B      no
6   B      yes

我想测量A组饮酒的人数和B组饮酒的人数。

我正在使用length(),但此函数返回3NA正在考虑=是)。我该如何解决?

5 个答案:

答案 0 :(得分:3)

table()是一个选项:

db <- read.table(text = "ID Group Drink
1   A      yes
2   A      no
3   A      NA
4   B      no
5   B      no
6   B      yes", header = TRUE)

with(db, table(Drink))
with(db, table(Group, Drink))

> with(db, table(Drink))
Drink
 no yes 
  3   2 
> with(db, table(Group, Drink))
     Drink
Group no yes
    A  1   1
    B  2   1

NA作为一个类包含在useNA参数中:

with(db, table(Drink, useNA = "ifany"))

> with(db, table(Drink, useNA = "ifany"))
Drink
  no  yes <NA> 
   3    2    1

您当然可以存储table()返回的对象,并将其作为任何其他矩阵/数组访问:

tab <- with(db, table(Drink, useNA = "ifany"))
tab[1]
tab2 <- with(db, table(Group, Drink, useNA = "ifany"))
tab2[,1]
tab2[1,]

> tab <- with(db, table(Drink, useNA = "ifany"))
> tab[1]
no 
 3 
> tab <- with(db, table(Drink, useNA = "ifany"))
> tab[1]
no 
 3 
> tab2 <- with(db, table(Group, Drink, useNA = "ifany"))
> tab2[,1]
A B 
1 2 
> tab2[1,]
  no  yes <NA> 
   1    1    1

答案 1 :(得分:2)

以下是使用aggregate(...)

的另一种方式
aggregate(Drink~Group,df,function(x)sum(x=="yes"))
#   Group Drink
# 1     A     1
# 2     B     1

获得喝酒的百分比:

aggregate(Drink~Group,df,function(x)sum(x=="yes")/length(!is.na(x)))
#   Group     Drink
# 1     A 0.5000000
# 2     B 0.3333333

答案 2 :(得分:1)

xtabs是另一种选择:

xtabs(~ Group + Drink, df)

#     Drink
#Group no yes
#    A  1   1
#    B  2   1

如果您需要data.frame作为输出:

as.data.frame(xtabs(~ Group + Drink, df))

#  Group Drink Freq
#1     A    no    1
#2     B    no    2
#3     A   yes    1
#4     B   yes    1

答案 3 :(得分:0)

假设d是您的数据,并且假设 NA 被视为 yes(因为您在帖子中说明了这一点) ,饮酒者的比例是

> d$Drink[is.na(d$Drink)] <- 'yes'
> tab <- table(d$Group, d$Drink)
> tab[,'yes']/rowSums(tab)
##         A         B 
## 0.6666667 0.3333333 

您还可以使用包count

中的plyr功能
> library(plyr)
> x <- count(d)
> cbind(x[x$Drink == 'yes', ], inGroup = count(d$Group)$freq)
#   Group Drink freq inGroup
# 2     A   yes    2       3
# 4     B   yes    1       3

答案 4 :(得分:-1)

您还可以使用函数prop.table(),它将为返回的表值添加比例。