You may try this:
library(reshape2)
temp <- melt(df)
df2 <- cbind(temp, colsplit(string = temp$variable, pattern = "_",
names = c("calc", "stat")))
df3 <- dcast(df2, sample + calc ~ stat, value.var = "value")
df3
# sample calc Var.3 hci lci
# 1 0.22um coverage 0.96 NA NA
# 2 0.22um invsimpson 20.36 20.76 19.99
# 3 0.22um nseqs 29445.00 NA NA
# 4 0.22um shannon 3.75 3.77 3.73
# 5 3um coverage 0.99 NA NA
# 6 3um invsimpson 8.76 8.95 8.59
# 7 3um nseqs 30212.00 NA NA
# 8 3um shannon 3.04 3.06 3.02
Possibly rename and reorder variables:
names(df3) <- c("sample", "calculator", "value", "hci", "lci")
df3[ , c("sample", "calculator", "value", "lci", "hci")]
# sample calculator value lci hci
# 1 0.22um coverage 0.96 NA NA
# 2 0.22um invsimpson 20.36 19.99 20.76
# 3 0.22um nseqs 29445.00 NA NA
# 4 0.22um shannon 3.75 3.73 3.77
# 5 3um coverage 0.99 NA NA
# 6 3um invsimpson 8.76 8.59 8.95
# 7 3um nseqs 30212.00 NA NA
# 8 3um shannon 3.04 3.02 3.06