我有一个矩阵,该矩阵来自一个包含三个原始列的表格:第 1 列 = 站点代码,第 2 列 = 物种代码,第 3 列 = 每个物种的生物量。每个地块中每个物种的生物量显示在矩阵中。可以使用以下三个选项之一计算矩阵(感谢对先前问题的反馈(:
reshape::cast(dissimBiom, plot ~ species, value = 'biomass', fun = mean)
by(dissimBiom, dissimBiom$biomass, function(x) with(x, table(plot, species)))
tapply(dissimBiom$biomass,list(dissimBiom$plot,dissimBiom$species),mean)
注意:dissim 是两列表的.csv文件名;dissimBiom 是三列表的.csv文件名。
我现在想基于上述矩阵生成一个相异矩阵。下面的代码需要素食主义者和生态主义者的软件包。
我之前使用过该功能
matrix <- with(dissim, table(plot,species))
仅基于两列(站点与物种(生成矩阵,然后使用
matrix.meta <- metaMDS(matrix, k=2, distance = "bray", trymax=10)
以生成相异性矩阵。这工作得很好。
相反,尝试生成相异性矩阵,其中矩阵是使用以下代码之一生成的(如上所述(
reshape::cast(dissimBiom, plot ~ species, value = 'biomass', fun = mean)
by(dissimBiom, dissimBiom$biomass, function(x) with(x, table(plot, species)))
tapply(dissimBiom$biomass,list(dissimBiom$plot,dissimBiom$species),mean
使用相同的函数
matrixBiom.meta <- metaMDS(matrixBiom, k=2, distance = "bray", trymax=10)
导致以下错误消息
Error in if (any(autotransform, noshare > 0, wascores) && any(comm < 0)) { :
missing value where TRUE/FALSE needed
注意:我从文件matrixBiom调用matrixBiom.csv我编写该文件以将NA转换为0,使用。
write.csv(matrixBiom, "matrixBiom.csv", na="0",row.names=TRUE)
与matrixBiom.meta相比,matrix.meta直接用于"矩阵",而无需编写.csv文件。
此外,由
matrix <- with(dissim, table(plot,species))
看起来像这样,
species
plot xanfla1 xangria xanret
a100f177r 1.4 0 8.9
a100f562r 0 5.6 0
a100f56r 22.4 0 1.3
而由其他任何一种方法生成的矩阵具有
zinunk ziz150 zizang
a100f177r 22.4 NA 2.6
a100f562r 1.3 NA NA
a100f56r NA 3.1 NA
a100f5r NA NA 0.2
我的问题是,
1( 在这两个功能中的任何一个
reshape::cast(dissimBiom, plot ~ species, value = 'biomass', fun = mean)
by(dissimBiom, dissimBiom$biomass, function(x) with(x, table(plot, species)))
tapply(dissimBiom$biomass,list(dissimBiom$plot,dissimBiom$species),mean
NA可以直接转换为0以避免在.csv文件中写入和读取,也许这可以解决问题?
2(三列表示例可以使用哪些修复来使用metaMDS进行NMDS?
3( 是否有替代函数来计算三列表例的相异矩阵?
任何建议将不胜感激。
请在下面找到可重现的数据子集:
> dput(dataframe)
structure(list(plot = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L), .Label = c("a1f17r",
"a1f56r", "a1m17r", "a1m5r"), class = "factor"), species = structure(c(12L,
29L, 16L, 21L, 24L, 19L, 6L, 13L, 14L, 5L, 16L, 12L, 26L, 9L,
29L, 28L, 17L, 15L, 25L, 6L, 3L, 8L, 27L, 6L, 1L, 7L, 18L, 10L,
12L, 11L, 2L, 20L, 13L, 27L, 22L, 23L, 4L, 1L), .Label = c("annunk",
"blurip", "cae089", "caepar", "chrodo", "clihir", "dalpin", "derele",
"embphi", "ficmeg", "indunk", "jactom", "leeind", "merbor", "mergra",
"mikcor", "nep127", "nepbis", "nepbis1", "palunk", "rubcle",
"sinirp", "spagyr1", "sphoos", "stitrut", "tetped", "tinpet",
"uncgla", "zinunk"), class = "factor"), biomass = c(100.6, 284.6,
13.8, 2.8, 1, 3.1, 8.8, 0.5, 15.2, 13.8, 6.1, 5.3, 18.8, 4.1,
199, 68, 143.3, 11.3, 6.5, 0.2, 54.1, 39, 22, 1.2, 6.3, 6, 0.1,
2.8, 42, 1.9, 0.1, 0.2, 0.2, 0.1, 2.1, 4.3, 0.7, 0.2)), .Names = c("plot",
"species", "biomass"), class = "data.frame", row.names = c(NA,
-38L))
问题 1:
不容易,所以在第二步中完成。我发现tapply()
结果更整洁,所以我会这样做:(假设您的示例数据在dat
(
dat2 <- as.data.frame(with(dat, tapply(biomass, list(plot, species), mean)))
给
> dat2[, 1:6]
annunk blurip cae089 caepar chrodo clihir
a1f17r NA NA NA NA NA 0.2
a1f56r NA NA NA NA 13.8 8.8
a1m17r 0.2 NA NA 0.7 NA NA
a1m5r 6.3 0.1 54.1 NA NA 1.2
然后将NA
转换为我们所做的0
dat2[is.na(dat2)] <- 0
这给了我们
> dat2[, 1:6]
annunk blurip cae089 caepar chrodo clihir
a1f17r 0.0 0.0 0.0 0.0 0.0 0.2
a1f56r 0.0 0.0 0.0 0.0 13.8 8.8
a1m17r 0.2 0.0 0.0 0.7 0.0 0.0
a1m5r 6.3 0.1 54.1 0.0 0.0 1.2
问题2:
鉴于 Q1 的解决方案,不需要进一步的步骤。
问题3:
按照上面问题 1 中的解决方案进行操作,然后运行 dist()
或 vegdist()
或一些其他函数,这些函数可以从数据框对象计算相异性矩阵。