Compute all standard FD indices (FRic, FEve, FDiv, FDis, RaoQ) in one call using FD::dbFD.
compute_FD_indices <- function(comm, traits, ndim = 3) {
if (!requireNamespace("FD", quietly = TRUE)) install.packages("FD")
library(FD)
sp <- intersect(colnames(comm), rownames(traits))
comm <- comm[, sp]
traits <- traits[sp, ]
res <- FD::dbFD(scale(traits), comm,
m = ndim,
calc.FRic = TRUE,
calc.CWM = FALSE,
print.pco = FALSE)
data.frame(
site = rownames(comm),
FRic = res$FRic,
FEve = res$FEve,
FDiv = res$FDiv,
FDis = res$FDis,
RaoQ = res$RaoQ
)
}
# ── Example ──────────────────────────────────────────────────────
# iris as species, each row = one individual → aggregate to species means
library(dplyr)
sp_traits <- iris |> group_by(Species) |>
summarise(across(where(is.numeric), mean)) |>
column_to_rownames("Species")
# 3 fake communities
comm <- matrix(c(1,1,0, 0,1,1, 1,0,1), nrow = 3, byrow = TRUE,
dimnames = list(c("C1","C2","C3"), rownames(sp_traits)))
compute_FD_indices(comm, sp_traits, ndim = 2)