source("http://192.38.117.59/~linearpredictors/datafiles/readCardiac.R") ## personwise standard deviation of log cardiac output sds.log <- tapply(log(cardiac$cardout), cardiac$person, function(x)(sqrt(var(x, na.rm = T)))) ## merging onto whole dataset cardiac$sd <- sapply(cardiac$person, function(x) sds.log[[x]]) ## collapse dataset by using only first row for each person ## should ideally test whether values within persons are indeed equal collapse <- function(d){ d[1,] } card <- subset(cardiac, select = -c(cardout, serialno)) card <- lapply(split(card, card$person), collapse) card <- do.call("rbind",card) ## now the tables: addmargins(xtabs(~ gender + pacemake, data = card)) with(card, tapply(sd, list(gender, pacemake), median) ) ## marginal medians with(card, tapply(sd, gender, median) ) with(card, tapply(sd, pacemake, median) ) ## overall median median(card$sd)