2016-11-13 3 views
2

나는 새가 둥지를 부화 성공을 계산하는 물류 노출을 사용하고 있습니다. 내 데이터 세트는 매우 광범위하고 ~ 2,000 개의 둥지가 있으며 고유 한 ID ("ClutchID")가 있습니다. 특정 네스트가 노출 된 일 수 ("Exposure")를 계산하거나보다 간단하게 . 첫째와 마지막 날 나는 다음과 같은 코드를 사용 :그룹별로 날짜의 차이를 계산 R

HS_Hatch$Exposure=NA  
for(i in 2:nrow(HS_Hatch)){HS_Hatch$Exposure[i]=HS_Hatch$DateVisit[i]- HS_Hatch$DateVisit[i-1]} 

HS_Hatch 내 데이터 세트이며 DateVisit는 실제 날짜입니다 유일한 문제는 R이하지 않는 (1 일에 대한 노출 값을 계산하는된다. ..

: 의미)

정말 주어진 클러치하기위한 곳 중 1 번째와 마지막 날짜 사이의 차이를 계산하는 것입니다 필요가 내가 또한 다음을 검토 한 결과

나는 아직도 R을 배우므로 어떤 도움을 주시면 대단히 감사하겠습니다. 편집

: 아래 는 우리가 단지 dplyr 패키지가 필요 내가 코멘트의 일부 수집

HS_Hatch <- structure(list(ClutchID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
             2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L 
), DateVisit = c("3/15/2012", "3/18/2012", "3/20/2012", "4/1/2012", 
       "4/3/2012", "3/18/2012", "3/20/2012", "3/22/2012", "4/3/2012", 
       "4/4/2012", "3/22/2012", "4/3/2012", "4/4/2012", "3/18/2012", 
       "3/20/2012", "3/22/2012", "4/2/2012", "4/3/2012", "4/4/2012", 
       "3/20/2012", "3/22/2012", "3/25/2012", "3/27/2012", "4/4/2012", 
       "4/5/2012"), Year = c(2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
             2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
             2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
             2012L), Survive = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                  1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), class = c("tbl_df", 
                                   "tbl", "data.frame"), row.names = c(NA, -25L), .Names = c("ClutchID", 
                                                 "DateVisit", "Year", "Survive"), spec = structure(list(cols = structure(list(
                                                  ClutchID = structure(list(), class = c("collector_integer", 
                                                            "collector")), DateVisit = structure(list(), class = c("collector_character", 
                                                                          "collector")), Year = structure(list(), class = c("collector_integer", 
                                                                                      "collector")), Survive = structure(list(), class = c("collector_integer", 
                                                                                                    "collector"))), .Names = c("ClutchID", "DateVisit", "Year", 
                                                                                                          "Survive")), default = structure(list(), class = c("collector_guess", 
                                                                                                                       "collector"))), .Names = c("cols", "default"), class = "col_spec")) 
+3

스택 오버플로에 오신 것을 환영합니다! [재현 가능한 예] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)를 제공 할 데이터를 제공해 주시겠습니까? –

+3

아마도'summarize (노출 = diff (range (DateVisit)))'입니까? –

+1

@BenBolker가 말했듯이, 그의'summarise' 라인은'group_by' 라인을 따라 가야한다고 덧붙입니다. 그리고'DateVisit' 클래스에 따라 첫 번째 mutate 줄을 남기거나'summarize' 줄을'DateVisit' 대신'Exposure'를 참조하도록 변경할 수 있습니다. – rosscova

답변

2

를 사용하고 데이터의 샘플 ...

로드 dplyr

입니다 이 문제. 다른 패키지를로드하는 경우 (예 : plyr, 두 패키지 모두 같은 이름의 함수가있는 경우 충돌이 발생할 수 있습니다. dplyr 만로드하십시오.

향후
library(dplyr) 

대신 tidyverse를로드 할 수 있습니다 - 그것은

이의 문자에서 DateVisit 변수를 변환하자 그래픽 dplyr 및 기타 관련 패키지 등

변환 날짜

을 포함 R이 날짜로 해석 할 수있는 문자열. 이렇게하면 R이 서로의 날짜를 뺀 날짜의 차이를 계산할 수 있습니다.

HS_Hatch <- HS_Hatch %>% 
mutate(date_visit = as.Date(DateVisit, "%m/%d/%Y")) 

날짜 형식 %m/%d/%Y은 원래 코드와 다릅니다. 이 날짜 형식은 데이터의 날짜 모양을 일치시켜야합니다. DateVisit은 월/일/년으로 날짜가 있으므로 %m/%d/%Y을 사용합니다. 이미 HS_Hatch에서 찾고 있기 때문에

또한, 당신은 HS_Hatch$DateVisit 같이 mutate 내부 DateVisit에 대한 데이터 집합을 지정할 필요가 없습니다. 코드 HS_Hatch %>% ...은 '다음 단계에 HS_Hatch 사용'이라고 말합니다. 노출을 계산하려면

계산 노출

, 우리는 ClutchID에 의한 행의 각 세트에 대해, 둘 사이의 첫 번째 날짜, 마지막 날짜, 다음의 차이를 찾을 필요가있다. summarize을 사용하여 데이터를 ClutchID 당 하나의 행으로 접습니다.우리가 group_by(ClutchID)을 사용하고 있기 때문에

exposure <- HS_Hatch %>% 
    group_by(ClutchID) %>% 
    summarize(first_visit = min(date_visit), 
       last_visit = max(date_visit), 
       exposure = last_visit - first_visit) 

first_visit = min(date_visit)는 별도로 각 ClutchID의 최소 date_visit을 찾을 수 있습니다.

exposure = last_visit - first_visit은 새로 계산 된 first_visitlast_visit을 취하고 그 차이를 찾습니다.

이것은 다음과 같은 결과를 생성합니다

ClutchID first_visit last_visit exposure 
    <int>  <date>  <date> <dbl> 
1  1 2012-03-15 2012-04-03  19 
2  2 2012-03-18 2012-04-04  17 
3  3 2012-03-22 2012-04-04  13 
4  4 2012-03-18 2012-04-04  17 
5  5 2012-03-20 2012-04-05  16 

모든 원래의 행을 유지하려면, 당신은 summarize 대신 mutate를 사용할 수 있습니다.

+0

정말 고마워요! 나는 이것을 알아 내려고 노력하면서 내 머리를 찢어 버렸다. R 코딩을 배우는 사람으로서, 코드를 단계별로 설명해 주셔서 감사합니다. 나는 그것을 이해하고 따라갈 수있었습니다. –

+0

답변으로 문제가 해결되면 "동의 함"을 클릭하십시오. 이것은 응답자에게 고맙다는 말을하는 데 도움이되며 다른 사람들이 미래에 해결책을 찾도록 도울 것입니다. – rosscova