首页 > 解决方案 > 在R中按组计算百分比

问题描述

我的数据集如下所示: 数据集 数据来自课程学生评价。这些列包括课程的分类数据,以及评分量规中各种标准的分数的数字数据。我正在尝试使用 R 来计算所有列的值等于或大于 3 的百分比。我想不出比手动更快的直接方法。谢谢费尔南多

标签: r

解决方案


这些tidyverse软件包非常适合此类任务。

library(tidyverse)

首先让我们创建一些虚拟数据。


df <- tibble(`1..Course` = rep(LETTERS[1:3], each=5),
             col1 = sample(c(NA,1:5), 15, replace=TRUE),
             col2 = sample(c(NA,1:5), 15, replace=TRUE),
             col3 = sample(c(NA,1:5), 15, replace=TRUE))

现在,对于每一列,我们要查看哪些值 > 3:

df$col1 > 3
 [1] FALSE    NA  TRUE    NA FALSE    NA    NA FALSE    NA FALSE FALSE  TRUE FALSE    NA FALSE

所以我们得到一个布尔值,如果我们尝试求和,它将自动转换为数字(0 和 1)。所以计算比例只是取平均值!

但是有缺失值,所以我们将明确地忽略它们:

mean(df$col1 > 3, na.rm = TRUE)
[1] 0.2222222

所以我们知道如何为一整列做这件事,现在我们可以使用 tidyverse 中的函数来做by当然:

df %>%
  group_by(`1..Course`) %>%
  summarize(prop_col1 = mean(col1 > 3, na.rm = TRUE),
            prop_col2 = mean(col2 > 3, na.rm = TRUE),
            prop_col3 = mean(col3 > 3, na.rm = TRUE))
# A tibble: 3 x 4
#  `1..Course` prop_col1 prop_col2 prop_col3
#  <chr>      <dbl>     <dbl>     <dbl>
#1 A          0.333      0.2       0.5 
#2 B          0          0.75      0.2 
#3 C          0.25       0         0.25

它已经完成了。

可能,您可能希望对每个条件都执行此操作,而无需键入它们。因此,您需要将标准类型视为变量,并将您的 data.frame 转换为长格式。然后适用相同的代码。

df %>%
  pivot_longer(-`1..Course`, names_to="criterium") %>%
  group_by(`1..Course`, criterium) %>%
  summarize(prop_value = mean(value > 3, na.rm = TRUE))

推荐阅读