Convert a wide species × traits matrix to long format (species, trait, value). Wrapper around reshape2::melt with sensible defaults.
pivot_long <- function(df, id_cols, trait_cols = NULL) {
if (is.null(trait_cols)) {
trait_cols <- setdiff(names(df), id_cols)
}
out <- reshape(df[, c(id_cols, trait_cols)],
varying = trait_cols,
v.names = "value",
timevar = "trait",
times = trait_cols,
direction = "long")
out$id <- NULL
rownames(out) <- NULL
out[, c(id_cols, "trait", "value")]
}
# Example
pivot_long(iris, id_cols = "Species")
# ── Example ──────────────────────────────────────────────────────
# Wide to long: iris species × 4 traits
long <- pivot_long(iris, id_cols = "Species")
head(long, 8)
# Visualise
library(ggplot2)
ggplot(long, aes(Species, value, fill = Species)) +
geom_boxplot() + facet_wrap(~ trait, scales = "free_y")