grades.R

Andrew Heiss — May 8, 2014, 12:07 AM

# Load libraries
library(reshape2)
library(dplyr)

Attaching package: 'dplyr'

The following objects are masked from 'package:stats':

    filter, lag

The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union

# Sample data
grades <- data.frame(name=c("Sally", "Jim"),
                     HW1=c(10, 9),
                     HW2=c(10, 5),
                     HW3=c(5, 10),
                     HW4=c(6, 9),
                     HW5=c(8, 9),
                     Quiz1=c(9, 5),
                     Quiz2=c(9, 10),
                     Quiz3=c(10, 8),
                     Exam1=c(95, 96))

# Melt into long form
grades.long <- melt(grades, id.vars="name", variable.name="graded.name") %.%
  mutate(graded.type=factor(gsub("(\\w+)\\d+","\\1", graded.name, perl=T)))
grades.long
    name graded.name value graded.type
1  Sally         HW1    10          HW
2    Jim         HW1     9          HW
3  Sally         HW2    10          HW
4    Jim         HW2     5          HW
5  Sally         HW3     5          HW
6    Jim         HW3    10          HW
7  Sally         HW4     6          HW
8    Jim         HW4     9          HW
9  Sally         HW5     8          HW
10   Jim         HW5     9          HW
11 Sally       Quiz1     9        Quiz
12   Jim       Quiz1     5        Quiz
13 Sally       Quiz2     9        Quiz
14   Jim       Quiz2    10        Quiz
15 Sally       Quiz3    10        Quiz
16   Jim       Quiz3     8        Quiz
17 Sally       Exam1    95        Exam
18   Jim       Exam1    96        Exam

# Remove the lowest scores for each graded type
grades.filtered <- grades.long %.%
  group_by(name, graded.type) %.%
  mutate(ranked.score=rank(value, ties.method="first")) %.%  # Rank all the scores
  filter((ranked.score > 2 & graded.type=="HW") |  # Ignore the lowest two HWs
         (ranked.score > 1 & graded.type=="Quiz") |  # Ignore the lowest quiz
         (graded.type=="Exam"))
grades.filtered
Source: local data frame [12 x 5]
Groups: name, graded.type

    name graded.name value graded.type ranked.score
1  Sally         HW1    10          HW            4
2  Sally         HW2    10          HW            5
3    Jim         HW3    10          HW            5
4    Jim         HW4     9          HW            3
5  Sally         HW5     8          HW            3
6    Jim         HW5     9          HW            4
7  Sally       Quiz2     9        Quiz            2
8    Jim       Quiz2    10        Quiz            3
9  Sally       Quiz3    10        Quiz            3
10   Jim       Quiz3     8        Quiz            2
11 Sally       Exam1    95        Exam            1
12   Jim       Exam1    96        Exam            1

# Calculate the average for each graded type
grade.totals <- grades.filtered %.%
  group_by(name, graded.type) %.%
  summarize(total=mean(value))
grade.totals
Source: local data frame [6 x 3]
Groups: name

   name graded.type  total
1   Jim        Exam 96.000
2   Jim          HW  9.333
3   Jim        Quiz  9.000
4 Sally        Exam 95.000
5 Sally          HW  9.333
6 Sally        Quiz  9.500

# Unmelt, just for fun
final.grades <- dcast(grade.totals, name ~ graded.type, value.var="total")
final.grades
   name Exam    HW Quiz
1   Jim   96 9.333  9.0
2 Sally   95 9.333  9.5