大家好,亲爱的栈溢出社区,
这是我的问题的背景:我有一个数据框架,每一列对应一个蝙蝠物种,每一行对应一个晚上测量的声学活动(每个晚上记录的不是所有物种的采样)。
,
> 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意味着)的数据框