目标:使用数据框中当前的数据生成两个地点的稀疏曲线图,显示物种多样性如何随着采样样方数量的增加而增加。
问题:许多教程采用的数据已经转换为列表或矩阵,并且尚不清楚作者如何从可能作为数据框收集的数据中获得这些数据。此外,许多稀疏曲线沿 x 轴都有个体数量,而我想要在现场采样的样方数量。我不清楚如何从这样的数据帧转换为大多数包中稀疏所需的格式,然后如何选择采样单元的数量作为 x 轴。
以下是一些示例数据:
['''
dat_rare =
structure(list(SITE = c("FOSSIL_CLIFFS", "FOSSIL_CLIFFS", "FOSSIL_CLIFFS",
"FOSSIL_CLIFFS", "FOSSIL_CLIFFS", "FOSSIL_CLIFFS", "FOSSIL_CLIFFS",
"FOSSIL_CLIFFS", "FOSSIL_CLIFFS", "FOSSIL_CLIFFS", "FOSSIL_CLIFFS",
"FOSSIL_CLIFFS", "FOSSIL_CLIFFS", "FOSSIL_CLIFFS", "FOSSIL_CLIFFS",
"PAINTED_CLIFFS", "PAINTED_CLIFFS", "PAINTED_CLIFFS", "PAINTED_CLIFFS",
"PAINTED_CLIFFS", "PAINTED_CLIFFS", "PAINTED_CLIFFS", "PAINTED_CLIFFS",
"PAINTED_CLIFFS", "PAINTED_CLIFFS", "PAINTED_CLIFFS", "PAINTED_CLIFFS",
"PAINTED_CLIFFS", "PAINTED_CLIFFS", "PAINTED_CLIFFS"), QUADRAT = c("Q1",
"Q1", "Q1", "Q1", "Q1", "Q10", "Q10", "Q10", "Q10", "Q11", "Q11",
"Q11", "Q11", "Q12", "Q12", "Q6", "Q6", "Q7", "Q7", "Q7", "Q7",
"Q8", "Q8", "Q8", "Q8", "Q8", "Q9", "Q9", "Q9", "Q9"), SPECIES = c("PERONS_LIMPET",
"PURPLE_BARNACLE", "SERPENT_SKIN_CHITON", "STAR_LIMPET", "SURF_BARNACLE",
"DARWINS_BARNACLE", "PERONS_LIMPET", "PIED_LIMPET", "SURF_BARNACLE",
"PERONS_LIMPET", "PIED_LIMPET", "SERPENT_SKIN_CHITON", "SURF_BARNACLE",
"GREEN_CHITON", "PERONS_LIMPET", "PERONS_LIMPET", "TURBAN_SHELL",
"BLACK_LIMPET", "PERONS_LIMPET", "PIED_LIMPET", "SURF_BARNACLE",
"BLACK_LIMPET", "PERONS_LIMPET", "PIED_LIMPET", "RIBBED_LIMPET",
"SURF_BARNACLE", "BLACK_LIMPET", "PERONS_LIMPET", "PIED_LIMPET",
"SERPENT_SKIN_CHITON"), n = c(836L, 3L, 1L, 108L, 4L, 4L, 60L,
34L, 24L, 36L, 11L, 2L, 228L, 8L, 20L, 25L, 26L, 20L, 15L, 300L,
6L, 15L, 60L, 520L, 1L, 3L, 385L, 420L, 210L, 4L)), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -30L), groups = structure(list(
SITE = c("FOSSIL_CLIFFS", "FOSSIL_CLIFFS", "FOSSIL_CLIFFS",
"FOSSIL_CLIFFS", "PAINTED_CLIFFS", "PAINTED_CLIFFS", "PAINTED_CLIFFS",
"PAINTED_CLIFFS"), QUADRAT = c("Q1", "Q10", "Q11", "Q12",
"Q6", "Q7", "Q8", "Q9"), .rows = structure(list(1:5, 6:9,
10:13, 14:15, 16:17, 18:21, 22:26, 27:30), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -8L), .drop = TRUE))
''']
我尝试转换数据并生成稀疏曲线,重要的是,采用两个站点并创建单独的数据集,然后独立绘制。我不确定是否有办法将它们结合起来并一次性完成所有工作。或者是否有一种更快、更简洁的方法来获得最终结果。
# Make "wide"
dat_rare.w <-
dat_rare %>%
pivot_wider(names_from = SPECIES, values_from = n, values_fill = 0)
dat_rare.w
dat_rare.w.foss =
dat_rare.w %>%
filter(SITE=="FOSSIL_CLIFFS") %>%
ungroup() %>%
select(!SITE)
dat_rare.w.foss =
dat_rare.w %>%
filter(SITE=="PAINTED_CLIFFS") %>%
ungroup() %>%
select(!SITE)
check = data.matrix(dat_rare.w.foss)
check
check2 <- check[,-1]
rownames(check2) <- check[,1]
#total number of species at each site (row of data)
S <- specnumber(check2)
# Number of INDIVIDULS per site (?)
raremax <- min(rowSums(check2)) # = 340;
# rarefy, w/ raremax as input (?)
Srare <- rarefy(check2, raremax)
# method = "rarefaction"
plot(specaccum(check2, method = "rarefaction"),main = "method = rarefaction")
legend("bottomleft", legend = "Note x-axis is # of plots")
# method = "rarefaction"
plot(specaccum(check2,
method = "rarefaction"),
xvar = "individuals",
main = "rarefaction, xvar = individuals")
legend("bottomleft", legend = "Note x-axis has large range")
您尝试过使用
rarecurve
中的vegan
功能吗?这符合您的要求吗?
library(vegan)
library(data.table)
setDT(dat_rare)
# Aggregate at the site level
dat_aggregated <- dat_rare[, .(n = sum(n)), by = .(SITE, SPECIES)]
# make data wide
dat_wide <- dcast(dat_aggregated, SITE ~ SPECIES, value.var = "n", fill = 0)
# create a matrix
dat_matrix <- as.matrix(dat_wide [,-1, with = FALSE])
# Create rarefaction curves
rarecurve(dat_matrix, xlab = "Number of quadrats", ylab = "Species diversity", col = c("blue", "red"), lty = 1, lwd = 2, label = TRUE)