首页 > 解决方案 > 在分类数据中查找百分比

问题描述

我想计算分类数据的百分比。

我有以下数据集。

library(tidyverse)

tib <- tibble(a = c("yes", "yes", "yes", "yes"),
              b = c("yes", "yes", "no", "yes"),
              c = c("AB", "yes", "AC", "no"),
              d = c("AC", "yes", "no", "AB"),
)             space = c("UP", "DO", "UP", "TA")

我想找到按空间分组的每个 a、b、c、d 列的百分比。

因此,例如,如果我们想查看“a”:

df_perc <- as.data.frame(prop.table(table(tib$space, tib$a)) * 100)

这使:

  Var1 Var2 Freq
1   DO  yes   25
2   TA  yes   25
3   UP  yes   50

哪个是对的。

现在,为了不对每一列都这样做,我正在尝试使用收集:

df_tidy <- tib %>%
    gather(key="let", value="response", -"space")
   

但我必须以某种方式按“空间”分组。

并做这样的事情:

df_perc <- as.data.frame(prop.table(table(df_tidy$let, df_tidy$response)) * 100)

标签: rdplyr

解决方案


这个怎么样:

tib %>% pivot_longer(-space, names_to = "vars", values_to="vals") %>% 
  group_by(space, vars, vals) %>% count() %>%
  ungroup %>% 
  group_by(vars) %>% 
  mutate(pct = (n/sum(n))*100) %>% 
  select(-n) %>% 
  pivot_wider(names_from="vars", values_from="pct", values_fill=0) 
# # A tibble: 8 x 6
#   space vals      a     b     c     d
#   <chr> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 DO    yes      25    25    25    25
# 2 TA    yes      25    25     0     0
# 3 TA    no        0     0    25     0
# 4 TA    AB        0     0     0    25
# 5 UP    yes      50    25     0     0
# 6 UP    no        0    25     0    25
# 7 UP    AB        0     0    25     0
# 8 UP    AC        0     0    25    25


推荐阅读