跨子列表工作

时间:2014-09-01 18:36:31

标签: r for-loop nested-lists lapply

此问题是earlier post的延续,但是添加了不同的数据集和更多细节。

我正在尝试为7个人按比例发生饮食项目,并使用下面的数据计算sd()。

data <- structure(list(IndID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L), .Label = c("P01", 
"P02", "P03", "P04", "P05", "P06", "P07"), class = "factor"), 
    PreyGen = structure(c(1L, 1L, 1L, 1L, 6L, 5L, 4L, 5L, 4L, 
    4L, 4L, 4L, 4L, 5L, 5L, 4L, 5L, 4L, 5L, 5L, 5L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 5L, 5L, 4L, 5L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 5L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    5L, 2L, 4L, 3L, 4L, 4L, 4L, 3L, 4L, 4L, 3L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 1L, 4L, 1L, 5L, 4L, 5L, 4L, 4L, 4L, 5L, 4L, 
    4L), .Label = c("Beaver", "Bobcat", "Coyote", "Deer", "Elk", 
    "Raccoon"), class = "factor")), .Names = c("IndID", "PreyGen"
), class = "data.frame", row.names = c(NA, -100L))

summary看起来像这样。

> summary(data)
 IndID       PreyGen  
 P01: 6   Beaver : 6  
 P02:23   Bobcat : 2  
 P03:12   Coyote : 4  
 P04:20   Deer   :71  
 P05:21   Elk    :16  
 P06: 7   Raccoon: 1  
 P07:11  

有7种不同的个体(IndID)属于同一物种和6种猎物(PreyGen)。每个人以不同的比例吃不同数量的猎物(这是与早期帖子的主要区别)。

我的目标是为每个人引导每个饮食项目的比例发生。 下面的循环为每个用替换采样的个体生成五种饮食。数据存储为个体列表,每个个体都包含样本饮食列表。

编辑为P01添加了set.seed()和完整输出

set.seed(1)
BootIndDiet <- list()
IndTotboot <- list()
for(i in unique(data$IndID)){
    for(j in 1:5){
        BootIndDiet[[j]] <- prop.table(table(sample(data$PreyGen[data$IndID == i], 
                        length(data$PreyGen[data$IndID == i]),replace = T)))
                        }
            IndTotboot[[i]] <- BootIndDiet
            }

自然饮食特定于每个个体(i)的比例和样本量。 P01的五个自举样本如下所示。

   > IndTotboot[[1]]
[[1]]

   Beaver    Bobcat    Coyote      Deer       Elk   Raccoon 
0.6666667 0.0000000 0.0000000 0.0000000 0.3333333 0.0000000 

[[2]]

   Beaver    Bobcat    Coyote      Deer       Elk   Raccoon 
0.8333333 0.0000000 0.0000000 0.0000000 0.1666667 0.0000000 

[[3]]

   Beaver    Bobcat    Coyote      Deer       Elk   Raccoon 
0.3333333 0.0000000 0.0000000 0.0000000 0.1666667 0.5000000 

[[4]]

   Beaver    Bobcat    Coyote      Deer       Elk   Raccoon 
0.6666667 0.0000000 0.0000000 0.0000000 0.1666667 0.1666667 

[[5]]

   Beaver    Bobcat    Coyote      Deer       Elk   Raccoon 
0.8333333 0.0000000 0.0000000 0.0000000 0.1666667 0.0000000 

我试图计算每个猎物种类比例发生的sd()。同样地,对于每个人(P01 - P07),我希望在5种饮食中每种猎物的比例出现sd()

虽然我的循环产生了正确的结果,但是当数据包含在嵌套列表中时,我想知道如何为每个猎物物种计算自然饮食的sd()

我这里只为每个人提供了5个样本(bootstraps),但希望生成10000个。

编辑根据@MrFlick的建议

示例输出看起来像这样

           P01 P02 P03 P04 P05 P06 P07
    Beaver  A
    Bobcat  B
    Coyote  C
     Deer   D
      Elk   E
    Raccoon F

其中&#34; A&#34;是所有五个样本中P01吃掉的海狸比例的sd。使用上面P01的输出,&#34; A&#34; = sd(0.6666667,0.8333333,0.3333333,0.66666667,0.8333333)。向下移动,&#34; B&#34;将代表所有五个样本中由P01吃掉的山猫比例的sd,以及每个猎物种类和个体的等等。

提前致谢。

1 个答案:

答案 0 :(得分:1)

所以这就是我如何接近它。首先,我定义一个*适用友好版本的rbind以使事情更清晰

rbindlist <- function(x) do.call(rbind, x)

然后我将此应用于每个人,创建一个比例矩阵,然后沿着列使用基本apply函数来计算每个人的sd

sapply(lapply(IndTotboot, rbindlist), apply, 2, sd)

返回

              P01        P02        P03        P04        P05       P06        P07
Beaver  0.2041241 0.00000000 0.00000000 0.00000000 0.00000000 0.1749636 0.04979296
Bobcat  0.0000000 0.00000000 0.00000000 0.00000000 0.05429407 0.0000000 0.00000000
Coyote  0.0000000 0.00000000 0.00000000 0.02236068 0.03984095 0.0000000 0.00000000
Deer    0.0000000 0.09425862 0.09128709 0.05477226 0.07968191 0.1749636 0.11853095
Elk     0.0745356 0.09425862 0.09128709 0.04472136 0.03984095 0.0000000 0.08131156
Raccoon 0.2173067 0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.00000000

根据需要。