我有一个大约有16列的数据框,这些列具有yes,no和中性类别。最后,我要计算是,否和中性的百分比。数据框的一个示例是:
a = c('yes', 'yes', 'no', 'neutral', 'no', 'yes','no','neutral','neutral')
b = c('no', 'yes','no', 'no', 'no', 'neutral', 'yes', 'neutral','neutral')
abcd = data.frame(a,b)
有什么方法可以在r中实现吗?
答案 0 :(得分:2)
如果您要计算整个数据帧的百分比,我们可以unlist
数据,使用table
计算其计数并将其转换为百分比。
table(unlist(abcd))/(nrow(abcd) * ncol(abcd)) * 100
# neutral no yes
# 33.333 38.889 27.778
如果您想分别为每一列执行此操作,我们可以使用sapply
sapply(abcd, table)/nrow(abcd) * 100
# a b
#neutral 33.333 33.333
#no 33.333 44.444
#yes 33.333 22.222
编辑
如果缺少某些级别,我们可以先将其转换为factor
,然后使用table
sapply(abcd, function(x)
table(factor(x, levels = c("Yes", "No", "Neutral"))))/nrow(abcd) * 100
答案 1 :(得分:0)
Base R解决方案:
# For each combination:
res <- data.frame(round(prop.table(table(abcd)) * 100, 2))
# For each var separately:
res$total_a_cat <- ave(res$Freq, res$a, FUN = sum)
res$total_b_cat <- ave(res$Freq, res$b, FUN = sum)
数据:
abcd <-
structure(list(
a = structure(
c(3L, 3L, 2L, 1L, 2L, 3L, 2L, 1L,
1L),
.Label = c("neutral", "no", "yes"),
class = "factor"
),
b = structure(
c(2L,
3L, 2L, 2L, 2L, 1L, 3L, 1L, 1L),
.Label = c("neutral", "no",
"yes"),
class = "factor"
)
),
class = "data.frame",
row.names = c(NA,-9L))