2013-01-02 349 views
1

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

我有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) : 
+0

如果您在一两天内没有得到答案,您可以尝试发布(将此链接指向此链接)到[email protected]列表,您可以在其中找到其他更好地理解问题背景的人... –

回答

1

会这样解决你的问题吗?

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

当然,还有更优雅的解决方案,但我真的不明白疏松是干什么的,你的链接并没有为我工作。

1

问题是ComLoop是一个数字向量,rrarefy()返回社区数据的数据帧。所以你试图将整个数据框推入数值向量的单个元素中。这是行不通的。

@ tophcito's Answer将工作,因为它返回一个列表,其中的组件是对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) 

我认为这是更好的做法是建立循环你需要的大小,因此,我原来的解决方案。

0

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

我假设您正在尝试多次生成稀释矩阵,然后计算每次稀疏运行中EPT分类群的数量并计算平均值和变异性。相反,我们是否可以改变现有的rarfy {vegan}代码以允许用户定义的特征(例如EPT与否,功能饲养组或者容差值),并且除了在多次运行中平均的现有总分类群丰富度数,使用IF THAN类型命令来平均每个特征状态在这些运行中的分类群丰富度?

将不需要产生多个输出矩阵。