计算R中个体重新捕获的增长

时间:2016-11-22 11:18:20

标签: r

我正在尝试从大型捕获/标记/重新捕获数据集中计算个体的增长。我有每个标记个体的数据,但并非所有人都被重新捕获。基本上,我捕获并标记一定大小的个体。一段时间之后,我会捕获并标记更大尺寸的个体。其中一些已被标记为重新捕获,而另一些则是新个体。

我想做的是采用这个数据集,然后计算重新获得的个体的增长。在它的基础上,这很简单。重新捕获的人每次都会拥有相同的标签号。因此,我只需要在重新捕获时从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] 

虽然这给了我正在寻找的数字,格式化根本不是我希望的,并且需要相当多的工作来清理它以继续处理数据所需的内容。

3 个答案:

答案 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