稀疏,社区矩阵和for循环

时间:2013-01-02 16:19:13

标签: r loops vegan

我是新用户,所以我提前为我的无知道歉。我有一个流宏大无脊椎动物数据的社区矩阵(作为行标题和物种作为列标题的图表)。我想将数据稀疏到每个绘图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这个数据集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) :

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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)

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

答案 2 :(得分:0)

user1943324,我也试图稀少,然后计算无脊椎动物指标,如%EPT。 然而,我采取了不同的方法,并遇到了有限的r编程经验的绊脚石。

我假设您试图多次生产稀薄基质,然后计算每次稀疏运行中EPT分类群的数量并计算平均值和变异性。

相反,我们是否可以改变现有的rarfy {vegan}代码以允许用户定义的特征(例如EPT与否,功能性喂养组或耐受值),以及除了多次运行平均的现有总分类群丰富度计数之外,使用IF THAN类型命令来平均每个特征状态的分类群丰富度?

不需要生成多个输出矩阵。