首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中按处理组和地点划分的多样性指数

R中按处理组和地点划分的多样性指数
EN

Stack Overflow用户
提问于 2017-06-06 03:27:45
回答 2查看 2.6K关注 0票数 3

我正在尝试使用素食者的diversity()函数来计算R中的逆辛普森多样性指数。我想为每个实验性的治疗计算这个指数。

我的数据看起来有点像这样,其中species是物种x站点列联表,env是处理因子x站点表:

代码语言:javascript
复制
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(),但都没有成功。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-06-06 14:45:07

diversity中没有这样的groups参数,因为它没有很好地定义:您是指一组中采样单元的平均多样性,还是指一组中采样单元的平均值的多样性?它们是不同的东西,最好显式地做你想让这个索引做的事情。

第一件事比较简单:只需计算SU的多样性,并按组取其平均值:

代码语言:javascript
复制
tapply(diversity(spe, "simpson"), env$Stage, mean)

对于平均社区的多样性,您首先需要通过groups聚合您的数据,然后计算每个组的多样性(对于大多数指数,meansum在通常的多样性()索引中给出相同的结果,但summean不起作用的某些情况下有效):

代码语言:javascript
复制
diversity(aggregate(. ~  env$Stage, spe, sum)[,-1], MARGIN=1, index="simpson")

aggregate想要添加一个额外的列来命名行,我们必须用[,-1]删除它,并给出转置的结果,我们需要设置MARGIN = 1 (或使用t()反向转置)。

如您所见,结果是不同的。有些人将这种差异称为beta多样性。

票数 1
EN

Stack Overflow用户

发布于 2017-06-06 05:49:31

我假设您的表是逐行连接的(例如。行1是"a 0 1 2 1")。如果是这样的话,也许这条路是对的:

将它们放入单个数据框中:

代码语言:javascript
复制
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获取数据帧列表:

代码语言:javascript
复制
split_spec_env<-split(spec_env, spec_env$Stage)

现在,如果您需要每个处理中的平均多样性,首先使用lapply获取每行的索引:

代码语言:javascript
复制
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

然后再次获得每个子集的平均索引(我认为这更有意义,但取决于您需要什么):

代码语言:javascript
复制
lapply(z, function(x){
  mean(x$div)
})

或者,如果你想从一个子集中获取所有的值,并在一个处理中获得整体的多样性:

代码语言:javascript
复制
lapply(z, function(x){
  y <- unlist(x[,1:4])
  diversity(y, "invsimpson")
})

编辑:我意识到你可能想要一个处理中的物种总和的多样性指数。如果是这种情况,请使用colSums

代码语言:javascript
复制
lapply(z, function(x){
  y <- colSums(x[,1:4])
  diversity(y, "invsimpson")
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44376286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档