2014-09-01 59 views
-1

此問題是從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)。每個人以不同的比例吃了不同數量的獵物(這是與之前的帖子的主要區別)。

我的目標是引導每個人每個飲食項目的比例發生。 下面的循環爲每個用替換採樣的個體生成五種飲食。數據存儲爲個人列表,每個列表包含樣本飲食列表。

EDIT加入set.seed()和滿輸出按比例和樣本大小P01

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個樣本(引導程序)爲每個單獨在這裏,而是希望通過@MrFlick

一個例子輸出應該是這樣的

產生10000

編輯按建議

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

其中「A」是P01在所有五個樣品中吃海狸的比例的sd。使用上面的P01的輸出,「A」= sd(0.6666667,0.8333333,0.33333333,0.66666667,0.8333333)。向下移動時,「B」代表所有五個樣本中P01吃掉的山貓比例的sd,以此類推。

在此先感謝。

+0

(-1)這個問題表示與鏈接問題相同的目標。如果這些答案不適合你,你可以提供賞金。 – 2014-09-01 18:43:07

+0

@Richard Scriven,由於我以前的文章缺乏特異性,所以答案奏效。另外,我之前發佈的數據並沒有反映我的真實數據。雖然目標是相同的,但要使用的數據是不同的。國際海事組織鏈接的問題可以被刪除,但指出SO背後的主人會打電話。 – 2014-09-01 18:47:49

+1

你還應該包括你想要的輸出。當使用像'sample'這樣隨機函數結果是可重現的時,它也會有助於使用'set.seed()'。當你說你想要「比例出現的sd」時,這是否意味着你只想爲每個動物的每個動物提供所有值的「sd」?所以對於P01,你會得到所有海狸比例的SD,然後是所有山貓比例的SD?你渴望的結果的「形狀」是什麼? – MrFlick 2014-09-01 19:21:28

回答

1

所以這裏是我可能會接近它。首先,我定義rbind的*適用的版本,以使事情更清潔

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

然後我將此每個人,創建比例的矩陣,那麼我使用基本apply功能沿列計算的每個

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

在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 

如所期望。

+0

謝謝@MrFlick!很有幫助。更具體的你的「*應用友好」的功能...?再次感謝。 – 2014-09-02 02:56:58

+1

這只是適用性好,即apply函數將數據作爲第一個參數傳遞,而'do.call'需要數據作爲第二個參數。所以輔助功能只是將數據推回參數槽。 – MrFlick 2014-09-02 03:29:03