【问题标题】:Nested loop in R with two level of variationR中的嵌套循环具有两级变化
【发布时间】:2021-12-06 07:45:40
【问题描述】:

亲爱的堆栈溢出社区,您好,

这是我的问题的背景:我有一个数据框,每一列对应一个蝙蝠物种,每一行对应一晚测量的声学活动(对于记录的每一晚,并非所有物种都被采样) .

例如:

> 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

为了测试抽样(夜数)对我的分位数估计的影响,我想做一个 boostrap。更具体地说,如果我使用 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 种蝙蝠活动方式。

谁能帮帮我?

(不知道够不够清楚……)

提前致谢

【问题讨论】:

    标签: r loops


    【解决方案1】:

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

    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 表示)

    【讨论】:

    • 非常感谢 glagla !它可以帮助我进一步解决我的问题。但是,对于您的第一个命题,我得到一个包含 68000 个元素的矩阵。我真正想要的是 67 个矩阵(3 到 70 个晚上)和 1000 个元素(平均值)。关于你的第二个建议,因为我的数据框中有很多 NA 它不起作用。我正在努力解决这个问题。
    • 对不起,我读你的问题有点太快了。我相应地更正了我的答案。我认为对于 NA 问题, na.rm 选项可以解决它。不完全确定,因为我没有在真实数据上进行测试。
    • 非常感谢您的修改!
    • 非常感谢您的修改!我稍微改变了一下,它工作得很好:` m
    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 2012-03-29
    • 2018-04-06
    • 1970-01-01
    • 2020-01-29
    • 2018-03-09
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多