我有一个看起来像这样的数据库:
ID Group Drink
1 A yes
2 A no
3 A NA
4 B no
5 B no
6 B yes
我想测量A组饮酒的人数和B组饮酒的人数。
我正在使用length()
,但此函数返回3
(NA
正在考虑=是)。我该如何解决?
答案 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(),它将为返回的表值添加比例。