我已经对如何处理空白(在平均计算中忽略)和分数(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