1

我是新的 R 用户,所以我提前为我的无知道歉。我有一个流大型无脊椎动物数据的社区矩阵(作为行标题和物种作为列标题的图)。我想将数据稀疏到每个地块 500 个人,执行 1000 次,然后计算流健康指标(例如,% EPT)。在这一点上,我还没有成功地建立一个循环来将数据稀疏 1000 次(甚至 10 次)。我正在使用一个简化的数据集(6 个物种,12 个地块)来找出正确的代码,因为我的社区矩阵有 > 100 个物种。我正在使用这个网站 (http://ichthyology.usm.edu/courses/multivariate/diversity.R) 作为开发正确代码的模板。提前感谢您对此代码的任何帮助。

我的矩阵有 6 个物种,12 个地块

comm
    X Attenella.margarita Baetidae Baetis.sp. Baetis.tricaudatus Caenis.sp. Diphetor.hageni
1   1                   0        0          0                  0          0              36
2   2                   0        0          0               1009          0             682
3   3                  51       51          0                609          0             406
4   4                   0        0         40                  0          0               0
5   5                   0        0         68                  0         68             203
 6   6                   0        0          0               1244          0               0
 7   7                   0        0       2090                  0          0               0
 8   8                   0        0         11                  0          0               0
 9   9                   0        0          0               4621          0               0
 10 10                   0        0          0               1515          0               0
 11 11                   0        0          0                 33          0               0
 12 12                   0        0          0                116          0               0

我可以rarefy使用 vegan 包将此数据集 1x,但我想重复执行此操作

rrarefy(comm, sample=5)
      X Attenella.margarita Baetidae Baetis.sp. Baetis.tricaudatus Caenis.sp. Diphetor.hageni
 [1,] 0                   0        0          0                  0          0               5
 [2,] 0                   0        0          0                  4          0               1
 [3,] 0                   2        0          0                  2          0               1
 [4,] 0                   0        0          5                  0          0               0
 [5,] 0                   0        0          1                  0          1               3
 [6,] 0                   0        0          0                  5          0               0
 [7,] 0                   0        0          5                  0          0               0
 [8,] 3                   0        0          2                  0          0               0
 [9,] 0                   0        0          0                  5          0               0
 [10,] 0                   0        0          0                  5          0               0
 [11,] 0                   0        0          0                  5          0               0
 [12,] 0                   0        0          0                  5          0               0

但是当我尝试将其作为循环执行 10 次时我没有运气

> ComLoop = 0
> for (i in 1:10) ComLoop[i] = rrarefy(comm, sample=5)
  Warning in ComLoop[i] = rrarefy(comm, sample = 5) :
4

3 回答 3

1

这样的事情会解决你的问题吗?

res <- lapply(as.list(1:10), function(x) rrarefy(comm, sample=5)) 

当然有更优雅的解决方案,但我真的不明白稀有在做什么,而且你的链接对我不起作用。

于 2013-01-02T16:35:00.573 回答
1

问题是这ComLoop是一个数字向量并rrarefy()返回社区数据的数据框。因此,您正试图将整个数据框推入数字向量的单个元素中。那是行不通的。

@tophcito 的答案将起作用,因为它返回一个列表,其组成部分是对rrarefy().

循环版本可以按如下方式完成:

require(vegan)
data(dune)
ComLoop <- vector(mode = "list", length =  5)
for (i in seq_along(ComLoop)) {
    ComLoop[[i]] <- rrarefy(dune, sample = 5)
}

这使

> str(ComLoop)
List of 5
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 1 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 1 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 0 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 0 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
 $ : num [1:20, 1:30] 0 0 0 0 0 0 0 0 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:20] "2" "13" "4" "16" ...
  .. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...

换句话说,一个列表,其组成部分是由稀有数据的随机社区矩阵生成的数据帧(到sample所述)。

请注意,在创建ComLoop列表以保存结果时,我明确说明了长度。您不需要明确说明长度,因为增加列表是您不需要预先分配存储空间的一个领域。所以你可以这样做:

ComLoop <- list()

但是你不能使用seq_along()我上面使用的成语。在那里,您需要明确说明i应该像最初那样采用的值:

for(i in 1:5)
    ComLoop[i] <- rrarefy(dune, sample = 5)

我认为设置所需的循环大小是更好的做法,因此是我最初的解决方案。

于 2013-01-02T17:25:42.727 回答
0

user1943324, I too am attempting to rarefy then calculate invertebrate metrics such as %EPT. However I am taking a different approach and have run into stumbling blocks with limited r-programming experience.

I assume you are trying to produce the rarefied matrix many times to then count the number of EPT taxa in each rarefaction run and calculate a mean and variability.

Instead, could we alter the existing rarfy{vegan} code to allow for user defined traits (e.g. EPT or not, functional feeding group, or tolerance value) and in addition to the existing total taxa richness count averaged over multiple runs, use an IF THAN type command to average the taxa richness of each individual trait state over those runs?

There would be no need to produce multiple output matrices.

于 2013-05-22T23:03:23.977 回答