2014-08-31 67 views
-1

我想引导的饮食项目7个人的比例发生和计算sd()工作与应用()函数

比方说有菜单上9个猎物。

Diet <- c("Beaver","Bird", "Bobcat","Coyote", "Deer", "Elk", 
    "Porcupine", "Raccoon", "SmMamm") 

而且这些猎物是由7口不同的同种

Inds <- c("P01", "P02", "P03", "P04", "P05", "P06", "P07") 

的人吃我的目标是引导每个单独的每种饮食项目的比例发生。
下面的循环产生用于每个单独的5个饮食即用更换采样(含有N = 20喂养各饮食)。数据存储为个人列表,每个列表包含样本饮食列表。

BootIndDiet <- list() 
IndTotboot <- list() 
for(i in Inds){ 
    for(j in 1:5){ 
     BootIndDiet[[j]] <- prop.table(table(sample(Diet, 20 ,replace = T))) 
         } 
      IndTotboot[[i]] <- BootIndDiet 
      } 

下面我已经包括个人P07的前两个日粮作为循环的示例结果

$P07 
$P07[[1]] 

    Beaver  Bird Bobcat  Deer  Elk 
    0.05  0.15  0.20  0.10  0.15 
Porcupine Raccoon SmMamm 
    0.15  0.15  0.05 

$P07[[2]] 

    Beaver  Bird Bobcat Coyote  Deer 
    0.15  0.10  0.20  0.05  0.05 
     Elk Porcupine Raccoon SmMamm 
    0.05  0.20  0.10  0.10 

然后我想要计算每个物种的比例的SD()为每个单独的。同样,对于每个人(P01 - P07),我希望在5种日粮中每种猎物的比例出现的sd()

虽然我的循环运行上面,我怀疑有避免列出一个更好的方法(可能使用boot()函数)...

虽然我只包括5个样本(引导程序),为每个在这里,我希望能产生一个不同的策略或如何申请sd()跨子列表是极大的赞赏10000

建议。

+0

除非存在内存问题,否则可以将数据以长格式“data.frame”与列-say- [ind,No_diet,prey,prop]存储在一起,然后您可以调用'aggregate(prop〜ind +猎物,mydataframe,SD)'。 – 2014-08-31 20:26:00

回答

2

我会尝试以这种方式来获得一个数组(而不是嵌套列表):

IndTotboot <-array(replicate(5*length(Inds),prop.table(table(sample(as.factor(Diet), 20 ,replace = T))),simplify=T), dim=c(length(Diet),5,length(Inds)), dimnames=list(Diet,NULL,Inds)) 

随着replicate您可以执行一个表达式的给定次数,并将结果保存为一个数组(如果可能的话)。我在Diet之前加了一个as.factor,以确保表格能够追踪每个饮食(即使是0频率的饮食)。

获得的IndTotboot对象是一个三维数组,其中第一个索引指示Diet,第二个引导程序复制和第三个Inds。从那里你可以用标准方式使用apply

编辑:

如果试图str(IndTotboot)你:

> str(IndTotboot) 
    num [1:9, 1:5, 1:7] 0.1 0.15 0.15 0.1 0.1 0.1 0.15 0.05 0.1 0.15 ... 
    - attr(*, "dimnames")=List of 3 
     ..$ : chr [1:9] "Beaver" "Bird" "Bobcat" "Coyote" ... 
     ..$ : NULL 
     ..$ : chr [1:7] "P01" "P02" "P03" "P04" ... 

第一行是最重要的。它说num [1:9, 1:5, 1:7],这意味着一个9x5x7阵列。其余的表示dimnames,维度的名称,这是一个列表。它们是矩阵的rownamescolnames的推广。

现在,为了获得sd每一个DietInds你只需要使用apply

apply(IndTotboot,MARGIN=c(1,3),sd) 
+0

很酷的想法@nicola,虽然我无法得到apply()的代码。 IndTotboot对象的str()表示列表,但lapply(IndTotboot,sd)的结果显然不正确。我错过了什么......? – 2014-08-31 23:32:03

+0

'IndTotboot'是一个数组,而不是一个列表。我将扩展我的答案以展示如何使用apply。 – nicola 2014-09-01 04:27:48

0

以下可能是有用的:

dd = data.frame(sapply(IndTotboot, function(x)x)) 

maindf = data.frame(Var1=as.character(), Freq=as.numeric()) 

for(rr in 1:nrow(dd)) for (cc in 1:ncol(dd)){ 
     maindf= merge(maindf, data.frame(dd[rr,cc]), all=TRUE) 
} 

> head(maindf, 10) 
    Var1 Freq 
1 Beaver 0.05 
2 Beaver 0.10 
3 Beaver 0.15 
4 Beaver 0.20 
5 Beaver 0.30 
6 Bird 0.05 
7 Bird 0.10 
8 Bird 0.15 
9 Bird 0.20 
10 Bird 0.25 


with(maindf, tapply(Freq, Var1, sd)) 
    Beaver  Bird  Bobcat  Coyote  Elk Porcupine Raccoon  SmMamm  Deer 
0.09617692 0.09354143 0.09354143 0.09354143 0.09354143 0.06454972 0.07905694 0.108.07905694 

对于每一个人:

counter=1 
for (cc in 1:ncol(dd)){ 
    maindf = data.frame(Var1=as.character(), Freq=as.numeric()) 
    for(rr in 1:nrow(dd)){ 
     maindf= merge(maindf, data.frame(dd[rr,cc]), all=TRUE) 
    } 
    cat("\nFor individual number: ",counter,"\n"); counter=counter+1 
    print(with(maindf, tapply(Freq, Var1, sd))) 
} 


For individual number: 1 
    Beaver  Bird  Bobcat  Coyote  Elk Porcupine Raccoon  SmMamm  Deer 
0.05000000 0.07637626 0.05000000 0.06454972 0.03535534 0.05000000 0.05000000 0.07637626 0.05000000 

For individual number: 2 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.05000000 0.108.03535534 0.05000000 0.09128709   NA 0.03535534 0.07637626 0.13149778 

For individual number: 3 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.03535534 0.07637626 0.12583057 0.03535534 0.03535534 0.06454972 0.05000000 0.10606602 0.06454972 

For individual number: 4 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.05000000 0.05000000 0.05000000 0.03535534 0.10408330 0.07905694 0.05000000 0.03535534 0.10408330 

For individual number: 5 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.05000000 0.03535534 0.05000000 0.03535534 0.03535534 0.03535534 0.05000000 0.05000000 0.07071068 

For individual number: 6 
    Beaver  Coyote  Deer  Elk Porcupine Raccoon  SmMamm  Bobcat  Bird 
0.10000000 0.07637626 0.03535534 0.05000000 0.07071068 0.03535534 0.05000000 0.10408330 0.10606602 

For individual number: 7 
    Beaver  Bird  Bobcat  Coyote  Deer  Elk Porcupine Raccoon  SmMamm 
0.03535534 0.05000000 0.10408330 0.07637626 0.05000000 0.13228757 0.07637626 0.03535534 0.05000000 

对于个人+物种:

maindf = data.frame(Var1=as.character(), Freq=as.numeric(), ind=as.numeric()) 
counter=1 
for (cc in 1:ncol(dd)){ 
    for(rr in 1:nrow(dd)){ 
     maindf= merge(maindf, cbind(data.frame(dd[rr,cc]),ind=counter), all=TRUE) 
    } 
    counter=counter+1 
} 
with(maindf, tapply(Freq, list(Var1,ind), sd)) 

        1   2   3   4   5   6   7 
Beaver 0.05000000 0.05000000 0.03535534 0.05000000 0.05000000 0.10000000 0.03535534 
Bird  0.07637626 0.108.07637626 0.05000000 0.03535534 0.10606602 0.05000000 
Bobcat 0.05000000 0.03535534 0.12583057 0.05000000 0.05000000 0.10408330 0.10408330 
Coyote 0.06454972 0.05000000 0.03535534 0.03535534 0.03535534 0.07637626 0.07637626 
Elk  0.03535534   NA 0.06454972 0.07905694 0.03535534 0.05000000 0.13228757 
Porcupine 0.05000000 0.03535534 0.05000000 0.05000000 0.05000000 0.07071068 0.07637626 
Raccoon 0.05000000 0.07637626 0.10606602 0.03535534 0.05000000 0.03535534 0.03535534 
SmMamm 0.07637626 0.13149778 0.06454972 0.10408330 0.07071068 0.05000000 0.05000000 
Deer  0.05000000 0.09128709 0.03535534 0.10408330 0.03535534 0.03535534 0.05000000 
+0

请参阅我上面的编辑。 – rnso 2014-09-01 03:42:54