With this dataframe:
table <- \" trt rep ss d1 d4 d5 d6 d7 1 1 1 0 0 0 0 0 1 1 2 0 0 0 0 0 1 1 3 0
Using data.table, something like this:
data.table
library(data.table) d <- data.table(d) d[,lapply(.SD,function(x) sum(x>0,na.rm=T)/sum(!is.na(x))), .SDcols=grep("^d",names(d),val=T), by=trt] trt d1 d4 d5 d6 d7 1: 1 0 0.2222222 0.4444444 0.5555556 0.5555556 2: 2 0 0.0000000 0.0000000 0.3750000 0.5000000