我有一个生物数据集,我想在其中计算质心之间的距离,每个质心代表一个给定的年份(因此距离是按顺序计算的(。我正在探索usedist::dist_between_centroids()
来计算高维空间中的距离,但这似乎相当困难,因为函数需要分组变量的矢量输入(在这种情况下,是年(。我已经研究了vegan::adonis()
作为一个替代函数,但我不知道如何提取距离。我附上了一些使用沙丘的样本数据,并将其中一个因素重新编码为"年份"我的实际数据集由大约20年的数据组成,所以像下面这样手动计算距离是不可行的。我认为使用dist_between_centroids()
的循环可以完成这项任务,但我不确定如何在循环中指定分组向量。
# Species and environmental data
require(vegan)
require(usedist)
dune <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.spe.txt', row.names = 1)
dune.env <- read.delim ('https://raw.githubusercontent.com/zdealveindy/anadat-r/master/data/dune2.env.txt', row.names = 1)
data(dune)
data(dune.env)
all_data <- cbind(dune.env, dune) %>%
arrange(Use)
all_data$Use <- recode_factor(all_data$Use, "Hayfield"="2017")
all_data$Use <- recode_factor(all_data$Use, "Haypastu"="2018")
all_data$Use <- recode_factor(all_data$Use, "Pasture"="2019")
bio_data <- all_data[,6:35]
bio_distmat <- vegdist(bio_data, method = "bray", na.rm=T)
#store distance in matrix
dist_between_mat <- as.data.frame(matrix(ncol=3, nrow=2))
colnames(dist_between_mat) <- c("start_centroid","end_centroid","distance")
dist_between_mat[1,1] = "2017"
dist_between_mat[1,2] = "2018"
dist_between_mat[1,3] = dist_between_centroids(bio_distmat, 1:7,8:15) #distance between 2017 and 2018
dist_between_mat[2,1] = "2018"
dist_between_mat[2,2] = "2019"
dist_between_mat[2,3] = dist_between_centroids(bio_distmat, 8:15,16:20) #distance between 2018 and 2019
您可以使用一个简单的for循环来实现这一点。但是,既然我们可以使用";整洁的";原则?
这里有一个解决方案,它在开始年份和结束年份进行迭代,生成一个单行tibble,然后将行连接到最终tibble中。
请注意,在您的可复制示例中,年份/级别是按逆时间顺序排列的。我使用级别排序,而不是将级别转换为年份,所以请确保这是您想要的顺序。
levels(all_data$Use)
#> [1] "2019" "2018" "2017"
n <- nlevels(all_data$Use)
start <- levels(all_data$Use)[1:(n - 1)]
start
#> [1] "2019" "2018"
end <- levels(all_data$Use)[2:n]
end
#> [1] "2018" "2017"
map2_dfr(start, end, ~ {
idx1 <- which(all_data$Use == .x)
idx2 <- which(all_data$Use == .y)
tibble(
start_centroid = .x,
end_centroid = .y,
distance = dist_between_centroids(bio_distmat, idx1, idx2)
)
})
#> # A tibble: 2 × 3
#> start_centroid end_centroid distance
#> <chr> <chr> <dbl>
#> 1 2019 2018 0.210
#> 2 2018 2017 0.327
创建于2022-07-27由reprex包(v2.0.1(
vegan::adonis
(或vegan::adonis2
(不会返回该信息。vegan::betadisper
确实如此。其结果对象包含作为到各个组质心的距离的distances
,并且元素group
具有相应组的信息。如果只想要一个组,则必须给定一个常量向量作为组。