我正在尝试使用素食者的diversity()函数来计算R中的逆辛普森多样性指数。我想为每个实验性的治疗计算这个指数。
我的数据看起来有点像这样,其中species是物种x站点列联表,env是处理因子x站点表:
spe <- read.table(header=TRUE, text="
S1 S2 S3 S4
0 1 2 1
0 1 1 0
1 0 0 3
0 1 0 1
1 2 1 0
")
env <- read.table(header=TRUE, text="
Stage
a
b
c
a
c
") 理想情况下,我会得到每个(a,b,c)处理因子的单一多样性指标值。
我知道specnumber()函数有一个组选项,但我没有看到任何类似的多样性,并希望找到一种简单的方法来做同样的事情。我尝试过应用summaryBy()、aggregate()和ddply(),但都没有成功。
谢谢。
发布于 2017-06-06 14:45:07
diversity中没有这样的groups参数,因为它没有很好地定义:您是指一组中采样单元的平均多样性,还是指一组中采样单元的平均值的多样性?它们是不同的东西,最好显式地做你想让这个索引做的事情。
第一件事比较简单:只需计算SU的多样性,并按组取其平均值:
tapply(diversity(spe, "simpson"), env$Stage, mean)对于平均社区的多样性,您首先需要通过groups聚合您的数据,然后计算每个组的多样性(对于大多数指数,mean和sum在通常的多样性()索引中给出相同的结果,但sum在mean不起作用的某些情况下有效):
diversity(aggregate(. ~ env$Stage, spe, sum)[,-1], MARGIN=1, index="simpson")aggregate想要添加一个额外的列来命名行,我们必须用[,-1]删除它,并给出转置的结果,我们需要设置MARGIN = 1 (或使用t()反向转置)。
如您所见,结果是不同的。有些人将这种差异称为beta多样性。
发布于 2017-06-06 05:49:31
我假设您的表是逐行连接的(例如。行1是"a 0 1 2 1")。如果是这样的话,也许这条路是对的:
将它们放入单个数据框中:
spec_env <- data.frame(species, env)
> spec_env
S1 S2 S3 S4 Stage
1 0 1 2 1 a
2 0 1 1 0 b
3 1 0 0 3 c
4 0 1 0 1 a
5 1 2 1 0 c使用split获取数据帧列表:
split_spec_env<-split(spec_env, spec_env$Stage)现在,如果您需要每个处理中的平均多样性,首先使用lapply获取每行的索引:
z<-lapply(split_spec_env, function(x){
x$div<-diversity(x[,1:4], index = "invsimpson")
return(x)
}
)
> z
$a
S1 S2 S3 S4 Stage div
1 0 1 2 1 a 2.666667
4 0 1 0 1 a 2.000000
$b
S1 S2 S3 S4 Stage div
2 0 1 1 0 b 2
$c
S1 S2 S3 S4 Stage div
3 1 0 0 3 c 1.600000
5 1 2 1 0 c 2.666667然后再次获得每个子集的平均索引(我认为这更有意义,但取决于您需要什么):
lapply(z, function(x){
mean(x$div)
})或者,如果你想从一个子集中获取所有的值,并在一个处理中获得整体的多样性:
lapply(z, function(x){
y <- unlist(x[,1:4])
diversity(y, "invsimpson")
})编辑:我意识到你可能想要一个处理中的物种总和的多样性指数。如果是这种情况,请使用colSums
lapply(z, function(x){
y <- colSums(x[,1:4])
diversity(y, "invsimpson")
})https://stackoverflow.com/questions/44376286
复制相似问题