需要帮助来计算列中每个分类变量的百分比

时间:2019-11-10 05:42:29

标签: r dataframe frequency

我有一个大约有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中实现吗?

2 个答案:

答案 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))