Я сделал несколько предположений о том, как обрабатывать пропуски (игнорировать при вычислении среднего значения) и баллах (является ли E возможной оценкой?).
Код намного длиннее относительно Акруна, хотя я Сделайте это шаг за шагом, отправив результаты на экран, чтобы было понятно, что происходит.
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