【问题标题】:R: R Script that Calculates Student GPA from Letter GradesR:根据字母成绩计算学生 GPA 的 R 脚本
【发布时间】:2020-07-16 02:01:43
【问题描述】:

我需要帮助起草一个 R 脚本,用于计算数据集中众多学生(由样本 ID 指定)的平均 GPA。 GPA 应使用标准 4 点量表(A=4、B=3、C=2、D=1 和 F=0)计算。如果学生没有指定成绩,则该作业不计入平均 GPA。

这是一个示例数据集:

df <- data.frame(sampleid = c(1, 2, 3, 4, 5, 6, 7), HW1 = c("A","","B","F","B","A","C"), HW2 = c("A","A","C","","A","D",""), Exam = c("A","A","A","A","A","D","B"))

【问题讨论】:

  • 最好包含您的预期输出

标签: r statistics


【解决方案1】:

我们可以创建一个命名向量来更改值,然后用rowMeans取平均值

nm1 <- setNames(4:0, c('A', 'B', 'C', 'D', 'F'))
rowMeans( `dim<-`(nm1[as.matrix(df[-1])], dim(df[-1])), na.rm = TRUE)
#[1] 4.000000 4.000000 3.000000 2.000000 3.666667 2.000000 2.500000

【讨论】:

  • 那是难以置信的简短和甜蜜 - 好东西。如果我正在做一个整洁的版本,我的步骤会更长 - 旋转 Df 长,创建成绩和分数的数据框,加入原始 df,然后分组并使用平均函数进行变异。
【解决方案2】:

我已经对如何处理空白(在平均计算中忽略)和分数(E 是可能的等级吗?)做了一些假设。

相对于 Akrun,代码要长得多,尽管我已经一步一步地完成它,将结果发送到屏幕以明确发生了什么。

library(tidyverse)

df <- data.frame(sampleid = c(1, 2, 3, 4, 5, 6, 7), HW1 = c("A","","B","F","B","A","C"), HW2 = c("A","A","C","","A","D",""), Exam = c("A","A","A","A","A","D","B"))
df

#Pivot data into long format
df_long <- df %>% pivot_longer(-1,"assessment")
df_long

#Make blank "" into NA so they will be ignored in mean calculation, and make "value" type character
df_long$value <- df_long$value %>% na_if("")
df_long$value <- as.character(df_long$value)
df_long

#make df_key of grades and their scores, "value" is a character to match df_long
df_key <- tibble(
  "value" = c("A", "B", "C", "D", "E", "F"),  
  "mark" = c(4,3,2,1,0,0))
df_key

#Join df_key to df
df_long <- full_join(df_long, df_key)
df_long

#Calculate mean by group (student)
results <- df_long %>% group_by(sampleid) %>% summarise(mean_grade=mean(mark, na.rm = TRUE))
results

【讨论】:

    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 2016-05-27
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多