我正在尝试从大型捕获/标记/重新捕获数据集中计算个体的增长。我有每个标记个体的数据,但并非所有人都被重新捕获。基本上,我捕获并标记一定大小的个体。一段时间之后,我会捕获并标记更大尺寸的个体。其中一些已被标记为重新捕获,而另一些则是新个体。
我想做的是采用这个数据集,然后计算重新获得的个体的增长。在它的基础上,这很简单。重新捕获的人每次都会拥有相同的标签号。因此,我只需要在重新捕获时从TL首次标记个体时减去总长度(TL)。但是,我不知道如何告诉R根据某个列选择前一行,然后对它应用一个函数。对我来说棘手的部分是我想要匹配的值在同一列中。我已经看了?%in%并试图看看plyr是否有什么可行,但找不到任何东西。
编辑:更长的数据框来处理同一个人的多个(超过2个)重新捕获。在这种情况下,应计算原始捕获的增长。
我使用以下方法创建了一个示例数据框:
tlran=c(rnorm(5,mean=50,sd=5),rnorm(5,mean=200,sd=5), rnorm(5,mean=400,sd=10))
TaggingData=as.data.frame(trunc(tlran,0))
names(TaggingData)="TL"
TaggingData$Tag=c(1,2,3,4,5,6,1,7,3,4,8,1,9,10,3)
TaggingData$Date=c("01.01.2015","01.01.2015","01.01.2015","01.01.2015","01.01.2015","01.01.2016","01.01.2016","01.01.2016","01.01.2016","01.01.2016","01.01.2017","01.01.2017","01.01.2017","01.01.2017","01.01.2017")
所以我的示例数据如下所示:
>TaggingData
TL Tag Date
1 36 1 01.01.2015
2 44 2 01.01.2015
3 51 3 01.01.2015
4 49 4 01.01.2015
5 50 5 01.01.2015
6 203 6 01.01.2016
7 198 1 01.01.2016
8 203 7 01.01.2016
9 193 3 01.01.2016
10 210 4 01.01.2016
11 403 8 01.01.2017
12 402 1 01.01.2017
13 393 9 01.01.2017
14 391 10 01.01.2017
15 415 3 01.01.2017
编辑:手动,我希望我的数据看起来像:
>TaggingData
TL Tag Date Growth
1 36 1 01.01.2015 NA
2 44 2 01.01.2015 NA
3 51 3 01.01.2015 NA
4 49 4 01.01.2015 NA
5 50 5 01.01.2015 NA
6 203 6 01.01.2016 NA
7 198 1 01.01.2016 162
8 203 7 01.01.2016 NA
9 193 3 01.01.2016 142
10 210 4 01.01.2016 161
11 403 8 01.01.2017 NA
12 402 1 01.01.2017 366
13 393 9 01.01.2017 NA
14 391 10 01.01.2017 NA
15 415 3 01.01.2017 364
基本上,我希望R意识到因为第7行中的标记号与第1行中的标记号相同,所以第7行的TL应该从第1行的TL中减去,理想情况下写在新列中,例如TaggingData $增长。
我很遗憾在这里完全迷失了。我可以使用重复项(TaggingData $ Tag)选择重复的标签号,但我觉得这对我没用。
有人可以建议一个包/功能来查看,甚至可以帮我解决一些代码吗?
编辑:我已经尝试了建议的聚合,并使用以下代码打包data.table:
Recap=data.table(TaggingData)
setkey(Recap,Tag)
Recap[,diff:=c(NA,diff(TL)),by=Tag]
虽然这给了我正在寻找的数字,格式化根本不是我希望的,并且需要相当多的工作来清理它以继续处理数据所需的内容。
答案 0 :(得分:1)
根据您的结果,您似乎想要cumsum
的{{1}}。要遵循diff
方法,请
data.table
P.S。我没有显示结果,因为您的示例中没有library(data.table)
Recap=data.table(TaggingData)
setkey(Recap,Tag)
Recap[,diff:=c(NA,cumsum(diff(TL))),by=Tag]
,因此结果与您的结果不符。
答案 1 :(得分:0)
注意,我也在努力标记重新捕获数据,所以我发布了更长时间的其他方法,但允许检查标记和重新捕获之间的持续时间。
set.seed(10)
tlran=c(rnorm(5,mean=50,sd=5),rnorm(5,mean=200,sd=5), rnorm(5,mean=400,sd=10))
TaggingData=as.data.frame(trunc(tlran,0))
names(TaggingData)="TL"
TaggingData$Tag=c(1,2,3,4,5,6,1,7,3,4,8,1,9,10,3)
TaggingData$Date=c("01.01.2015","01.01.2015","01.01.2015","01.01.2015","01.01.2015","01.01.2016","01.01.2016","01.01.2016","01.01.2016","01.01.2016","01.01.2017","01.01.2017","01.01.2017","01.01.2017","01.01.2017")
TaggingData$Date <- as.Date(strptime(TaggingData$Date,format="%d.%m.%Y"))
require(dplyr)
require(plyr)
growth<-plyr::join(
group_by(TaggingData,Tag)%>%
slice(which.min(Date))%>%
summarize(
capture=min(Date),
TL1=min(TL)),
group_by(TaggingData,Tag)%>%
slice(which.max(Date))%>%
summarize(
lastcapture=max(Date),
TL2=max(TL))
)%>%
mutate(
duration_year=as.numeric(difftime(lastcapture,capture,units="days")/365),
growth=TL2-TL1)%>%
mutate(yearly_growth=growth/duration_year)%>%
arrange(Tag)
所以最后我的表看起来像:
Tag capture TL1 lastcapture TL2 duration growth yearly_growth
1 1 2015-01-01 50 2017-01-01 407 731 days 357 0.001338006
2 2 2015-01-01 49 2015-01-01 49 0 days 0 NaN
3 3 2015-01-01 43 2017-01-01 407 731 days 364 0.001364241
4 4 2015-01-01 47 2016-01-01 198 365 days 151 0.001133421
5 5 2015-01-01 51 2015-01-01 51 0 days 0 NaN
6 6 2016-01-01 201 2016-01-01 201 0 days 0 NaN
7 7 2016-01-01 198 2016-01-01 198 0 days 0 NaN
8 8 2017-01-01 411 2017-01-01 411 0 days 0 NaN
9 9 2017-01-01 397 2017-01-01 397 0 days 0 NaN
10 10 2017-01-01 409 2017-01-01 409 0 days 0 NaN
答案 2 :(得分:0)
另一种方式
dcast(Recap, Tag ~ Date, value.var = c("TL"))
给出以下内容,而不是增长,但在标记具有固定日期的campains时可能有用
Tag 2015-01-01 2016-01-01 2017-01-01
1: 1 50 193 407
2: 2 49 NA NA
3: 3 43 191 407
4: 4 47 198 NA
5: 5 51 NA NA
6: 6 NA 201 NA
7: 7 NA 198 NA
8: 8 NA NA 411
9: 9 NA NA 397
10: 10 NA NA 409