2016-11-22 2 views
1

Я пытаюсь рассчитать рост для людей из большого набора данных захвата/маркировки/повторной поимки. У меня есть данные для каждого отмеченного человека, но не все из них были отловлены. В принципе, я фиксирую и маркирую людей определенного размера. Через некоторое время я фиксирую и отмечаю людей большего размера. Некоторые из них уже отмечены повторной поимкой, в то время как другие - новые люди.Вычисление роста отдельных повторных захватов в R

Что я хотел бы сделать, так это взять этот набор данных, а затем увеличить число вычислений для возвращенных лиц. На его базе это довольно просто. Каждый возвращенный человек будет иметь один и тот же номер тега. Таким образом, мне просто нужно вычесть общую длину (TL), когда человек был впервые отмечен от TL при повторной поимке. Однако я не знаю, как сказать R выбрать предыдущую строку на основе определенного столбца, а затем применить к ней функцию. Мне сложно понять, что значения, которые я пытаюсь сопоставить, находятся в одном столбце. Я посмотрел на% в% и попытался выяснить, есть ли у plyr что-нибудь, что сработает, но ничего не могло найти.

EDIT: более длинный фрейм данных для обработки нескольких (более 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 

EDIT: Вручную, что я хотел бы мои данные, чтобы выглядеть следующим образом:

>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 

в принципе, я хочу Р понимать, что, так как количество тегов в строке 7 идентична той, в строке 1 TL для строки 7 следует вычесть из TL в строке 1 и идеально записать в новый столбец, например TaggingData $ Growth.

Я, к сожалению, полностью потерян здесь. Я могу выбрать дубликаты тегов с использованием дубликатов (TaggingData $ Tag), но я чувствую, что это не помогает мне.

Может ли кто-нибудь предложить пакет/функции для просмотра или даже помочь мне с кодом?

EDIT: Я попробовал предложенный агрегат, а также пакет data.table со следующим кодом:

Recap=data.table(TaggingData) 
setkey(Recap,Tag) 
Recap[,diff:=c(NA,diff(TL)),by=Tag] 

В то время как это дает мне цифры Я ищу, форматирование не совсем то, что я надеялся и потребовал бы довольно много работы, чтобы очистить его до того, что мне нужно, чтобы продолжить работу с данными.

+0

Можете ли вы привести свой пример ab он больше? Что происходит, когда 1 появляется в третий раз? Вы выходите из строки с 7 по 197 ?. –

+0

@Roman, это на самом деле то, о чем мне было интересно. Кажется, я могу получить что-то, работающее с data.table, но пока он вычисляет темпы роста для меня, он не выдает форматирования, на которое я надеялся. Я отредактирую свой оригинальный вопрос и разберусь. –

ответ

1

На основании вашего результата кажется, что вы хотите cumsumdiff. Для того, чтобы следовать вашим data.table подход, то

library(data.table) 
Recap=data.table(TaggingData) 
setkey(Recap,Tag) 
Recap[,diff:=c(NA,cumsum(diff(TL))),by=Tag] 

P.S. Я не показываю результаты, так как вы не сделали set.seed в вашем примере и, следовательно, результаты не будут соответствовать вашим.

+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 
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 
Смежные вопросы