R中的嵌套循环具有两级变化



大家好,亲爱的栈溢出社区,

这是我的问题的背景:我有一个数据框架,每一列对应一个蝙蝠物种,每一行对应一个晚上测量的声学活动(每个晚上记录的不是所有物种的采样)。

,

> Dataset
Bba Ese Hsa Mda Mda.Mca Mema Mpu
1     3  NA  NA  NA      33   NA  NA
2    NA  NA  NA  NA       1   NA  NA
3     2   4   1  NA      19    1  NA
4    NA  NA  NA  NA      25   NA  NA
5    NA  NA  NA  NA       3   NA  NA
6     1   1  NA  NA      53   NA  NA
7     1  NA   9  NA      NA    1  NA
8    NA  NA  10  NA      NA   NA  NA
9    NA  NA  NA  NA      NA   NA  NA
10    1   1  NA  NA      NA   NA  NA
11    6  NA  NA  NA      NA   NA  NA
12   12  NA   1  NA      NA    1  NA
13    3  NA   2  NA      NA    1  NA
14    1  NA  NA  NA      NA   NA  NA
15   NA  NA  NA  NA      NA   NA  NA
16    1  NA  NA  NA      NA   NA  NA
17    2  NA  NA  NA      NA    2  NA
18    1   1  NA  NA      NA   NA   1
19   NA  NA  NA  NA      NA   NA  NA
20    1   1  NA  NA      NA   NA  NA
21    2  NA   1  NA      NA   NA  NA
22    1  NA  NA  NA      NA    4  NA
23    1  NA   1  NA      NA    1  NA
24   NA  NA  NA  NA      NA    2  NA
25    1  NA  NA  NA      NA   NA  NA
26    1  NA  NA  NA      NA    1  NA
27    1  NA  NA  NA      NA   NA  NA
28    5  NA  NA  NA      NA   NA  NA
29   NA  NA  NA  NA      NA   NA  NA
.....

为了研究声音活动,我正在检查每个物种蝙蝠声音活动的分位数

apply(Dataset[,9:15],2,quantile, na.rm=TRUE, type=7, c(0.02,0.25,0.5,0.75,0.98))
Bba   Ese    Hsa    Mda Mda.Mca  Mema Mpu
2%   1.00  1.00   1.00   1.00    1.00  1.00   1
25%  1.00  1.00   2.00   2.00    2.00  1.00   1
50%  3.00  4.00   6.00   4.00    3.00  2.00   2
75%  9.75 12.00  18.00  12.00   20.00  4.00   6
98% 53.86 69.88 166.12 313.32  159.04 27.28  44

为了测试采样(夜数)对我的分位数估计的影响,我想做一个引导。更具体地说,我想计算蝙蝠活动的平均值,如果我使用1000个随机样本替换每个物种只取3个晚上。如果我要花3到70个晚上的话。这是我目前得到的(一个物种):

Bbana<-as.data.frame(Bbana)
L= length(Bbana[,1]) 
B= 1000 
m<-list()
for (j in 3:70) {
for (i in 1 : B) {
idx<-sample(1:L, j, replace=TRUE)
data_idx<-Bbana[idx, ]
m[i]<-mean(data_idx)
}}

不知何故,它没有给我我所期望的:67个列表,1000种蝙蝠活动方式。

有人能帮我吗?

(我不知道是否足够清楚…)

Thanks in advance

如果你想坚持循环和列表:

for (j in 3:70) {
mat = matrix(NA, nrow = B, ncol = ncol(idx))
for (i in 1 : B) {
idx<-sample(1:L, j, replace=TRUE)
data_idx<-Bbana[idx, ]
mat[i,] = colMeans(data_idx, na.rm = TRUE)
}
m[[j]] = mat
}

否则,这个选项应该可以工作(并且应该更有效/更方便使用):

sample.fun = function(nb.nights, dataset){
# select randomly nb.nights rows to sample 
selected.rows = sample(1:nrow(dataset), nb.nights, replace = FALSE)
# return a vector with their means
return(colMeans(dataset[select.rows,], na.rm = TRUE))
}
sapply(3:67, function(nights) replicate(1000, sample.fun(nights, dataset), simplify = 'array'), simplify = FALSE)

这将返回一个包含67个元素的列表,每个元素包含1000行(每个物种1000意味着)的数据框

最新更新