我有一个数据集,我需要计算重新捕获概率。我想如果我在捕获1的两个事件之间求和0(物种不重新捕获)的值并将该值除以潜在捕获的数量(所有事件1加上1之间的所有事件,所以0)会给我一个重新夺回的概率。
E.g。如果我有1 1 0 1
这将是1/4 = .25所以我有25%的机会没有重新夺回一个物种。在另一种情况下,如果我有1 0 0 1
,我会有2/4这样有50%的机会重获这个物种。最后,如果我有1 1 1 0
,这将是0/3,因此0%的物种没有被重新捕获。
有没有办法在此数据集中自动执行此操作?
structure(list(y.2010 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), y.2011 = c(1,
1, 1, 0, 1, 1, 1, 0, 0, 1, 1), y.2012 = c(0, 0, 0, 1, 0, 0, 1,
0, 0, 0, 1), y.2013 = c(0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0), y.2014 = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0), BANDFINAL = c("JP179", "JP197",
"JP209", "JP2340", "JP3118", "JP3120", "JP3162", "JP3164", "JP3165",
"JP3170", "JP3171")), .Names = c("y.2010", "y.2011", "y.2012",
"y.2013", "y.2014", "BANDFINAL"), row.names = c(103L, 113L, 120L,
125L, 140L, 142L, 151L, 153L, 154L, 156L, 157L), class = "data.frame")
打印出来:
y.2010 y.2011 y.2012 y.2013 y.2014 BANDFINAL
103 1 1 0 0 0 JP179
113 1 1 0 0 0 JP197
120 1 1 0 0 0 JP209
125 1 0 1 0 0 JP2340
140 1 1 0 0 0 JP3118
142 1 1 0 0 0 JP3120
151 1 1 1 1 0 JP3162
153 1 0 0 1 0 JP3164
154 1 0 0 1 0 JP3165
156 1 1 0 0 0 JP3170
157 1 1 1 0 0 JP3171
最后,它假设这样做:
0
0
0
1/3
0
0
0
2/4
2/4
0
0
谢谢,
答案 0 :(得分:5)
我的猜测@Ben是对的,但我对这种识字并不熟悉,这个问题看起来很有趣,所以我的foo
尝试使用vectorized {{base
1}}和max.col
函数用于计算概率
rowSums
答案 1 :(得分:2)
您可以使用dplyr
。
首先我们将gather
数据转换成长格式。然后我们group_by
乐队。然后我们summarise
第一个和最后一个捕获,以及概率,它是第一个和最后一个之间的0的数量:
library(dplyr)
library(tidyr)
dat %>% gather(year, val, -BANDFINAL) %>%
group_by(BANDFINAL) %>%
summarise(first = min(which(val == 1)),
last = max(which(val == 1)),
prob = sum(val[first:last]==0)/(last - first +1))
Source: local data frame [11 x 4]
BANDFINAL first last prob
(chr) (int) (int) (dbl)
1 JP179 1 2 0.0000000
2 JP197 1 2 0.0000000
3 JP209 1 2 0.0000000
4 JP2340 1 3 0.3333333
5 JP3118 1 2 0.0000000
6 JP3120 1 2 0.0000000
7 JP3162 1 4 0.0000000
8 JP3164 1 4 0.5000000
9 JP3165 1 4 0.5000000
10 JP3170 1 2 0.0000000
11 JP3171 1 3 0.0000000