pres_age <- function() { #data all_pres <- read.csv2("http://pastebin.com/raw/B0p5fts3", stringsAsFactors=FALSE) all_pres[, "birthdate"] <- as.Date(strptime(all_pres[,"birthdate"], "%d.%m.%Y")) all_pres[, "inauguration.date"] <- as.Date(strptime(all_pres[,"inauguration.date"], "%d.%m.%Y")) all_pres[, "age_at_inauguration"] <- age_at(all_pres[, "birthdate"], all_pres[, "inauguration.date"]) cand <- read.csv("http://pastebin.com/raw/q8vaN7ix", stringsAsFactors=FALSE, colClasses="character") cand[, "birthday"] <- as.Date(strptime(cand[, "birthday"], "%m/%d/%Y")) cand[, "inauguration.date"] <- as.Date("2017-01-20", "%Y-%m-%d") cand[, "age_at_inauguration"] <- age_at(cand[, "birthday"], cand[, "inauguration.date"]) #base plot plot(x=1, col="white", xlim=c(0.2, 2.8), ylim=c(35,80), ylab="Age at inauguration", xlab="", axes=FALSE) axis(2, at=seq(40,70,by=10)) axis(1, at=c(1,2), labels=c("Democrats", "Republicans"), tick=FALSE) #historic max_age <- max(all_pres[, "age_at_inauguration"]) max_idx <- which(all_pres[, "age_at_inauguration"]==max_age) abline(h=max_age, col="darkgrey", lwd=1.5) text(x=2.8, y=max_age+1, labels=paste(all_pres[max_idx, "name"], collapse="\n"), pos=2, cex=0.6, offset=-1) min_age <- min(all_pres[, "age_at_inauguration"]) min_idx <- which(all_pres[, "age_at_inauguration"]==min_age) abline(h=min_age, col="darkgrey", lwd=1.5) text(x=2.8, y=min_age+1, labels=paste(all_pres[min_idx, "name"], collapse="\n"), pos=2, cex=0.6, offset=-1) mean_age <- mean(all_pres[, "age_at_inauguration"]) abline(h=mean_age, col="darkgrey", lty="dotted", lwd=1.5) text(x=2.8, y=mean_age+1, labels="average", pos=2, cex=0.6, offset=-1) # candidates set.seed(13) col_map <- c(Democrat="blue", Republican="red") xpos_map <- c(Democrat=1, Republican=2) xpos <- jitter(xpos_map[cand[, "party"]], factor=2) points(x=xpos, y=cand[, "age_at_inauguration"], col=col_map[cand[,"party"]], pch=19) text(x=xpos, y=cand[, "age_at_inauguration"], col=col_map[cand[,"party"]], labels=cand[,"candidate"], pos=1, cex=0.6) } age_at <- function(birth, at) { if(!length(birth)==length(at)) stop("birth and at need same length") if(!inherits(birth, "Date")) stop("birth needs to be a Date") if(!inherits(at, "Date")) stop("at needs to be a Date") res <- rep(NA, length(birth)) for (i in seq_along(birth)) res[i] <- length(seq(birth[i], at[i], "years"))-1 return(res) }