首页 > 解决方案 > 如何将字符转换为数值并根据分类列对它们进行平均?

问题描述

这是示例数据:

project = c("ProjA", "ProjA", "ProjB", "ProjB","ProjC", "ProjC")
Q1 = c("Unlikely", "Very likely", "Likely","Unlikely", "Very likely", "Likely" )
Q2 = c("Very easy", "Easy", "Difficult", "Neutral","Very easy", "Easy")

masterdf = data.frame(project, Q1,Q2)

我的目标是将 Q1 和 Q2 转换成百分比,然后根据他们所在的项目进行平均。这样,我们可以在每个问题中找到每个项目的平均表现。

我尝试过的是:

value = c("Likely", "Very likely")
Q1 = masterdf %>% count(Q1) %>% arrange(desc(n))
Q1 = Q1 %>% mutate(pct = Q1$n/sum(Q1$n) *100) %>% 
  filter(Q1 %in% value)

但它不起作用,而且它与它所属的项目无关。这些值是前 2 个框,因此非常可能、可能、容易和非常容易将是成功的。理想情况下,我想要一张如下所示的表格:

项目 第一季度 第二季度
项目 50% 47%
项目B 50% 47%
项目 50% 47%

标签: rdplyr

解决方案


masterdf %>% 
  # Make a tidy dataset
  pivot_longer(
    cols=starts_with("Q"), 
    names_to="Question", 
    values_to="Answer"
  ) %>% 
  # Convert from categorical to binary
  mutate(Success=Answer %in% c("Very Likely", "Likely", "Easy", "Very Easy")) %>% 
  # Calculate success rates by project and question
  group_by(project, Question) %>% 
  summarise(Rate=100*sum(Success)/n(), .groups="drop") %>% 
  # Transpose for pressentation
  pivot_wider(
    names_from=Question,
    values_from=Rate
  )

# A tibble: 3 x 3
  project    Q1    Q2
  <fct>   <dbl> <dbl>
1 ProjA       0    50
2 ProjB      50     0
3 ProjC      50    50

使用整洁数据的一些优点是代码在项目数量和标签以及问题和响应数量的变化方面是健壮的。它也更适合 tidyverse 动词,因为它们是为整洁的数据设计的。


推荐阅读