我是新用户,所以我提前为我的无知道歉。我有一个流宏大无脊椎动物数据的社区矩阵(作为行标题和物种作为列标题的图表)。我想将数据稀疏到每个绘图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) :
答案 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类型命令来平均每个特征状态的分类群丰富度?
不需要生成多个输出矩阵。