工作与应用()函数
我想引导的饮食项目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
建议。
我会尝试以这种方式来获得一个数组(而不是嵌套列表):
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
,维度的名称,这是一个列表。它们是矩阵的rownames
和colnames
的推广。
现在,为了获得sd
每一个Diet
和Inds
你只需要使用apply
:
apply(IndTotboot,MARGIN=c(1,3),sd)
很酷的想法@nicola,虽然我无法得到apply()的代码。 IndTotboot对象的str()表示列表,但lapply(IndTotboot,sd)的结果显然不正确。我错过了什么......? – 2014-08-31 23:32:03
'IndTotboot'是一个数组,而不是一个列表。我将扩展我的答案以展示如何使用apply。 – nicola 2014-09-01 04:27:48
以下可能是有用的:
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
请参阅我上面的编辑。 – rnso 2014-09-01 03:42:54
除非存在内存问题,否则可以将数据以长格式“data.frame”与列-say- [ind,No_diet,prey,prop]存储在一起,然后您可以调用'aggregate(prop〜ind +猎物,mydataframe,SD)'。 – 2014-08-31 20:26:00