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