2016-11-13 4 views
2

Я использую логистическую экспозицию для расчета успеха инкубации для птичьих гнезд. Мой набор данных довольно обширен, и у меня есть ~ 2000 гнезд, каждый с уникальным идентификатором («ClutchID»). Мне нужно рассчитать количество дней, в течение которых данное гнездо было выставлено («Экспозиция»), или, проще говоря, разница между . первый и последний день, когда я использовал следующий код:Вычислить разницу между датами по группам в 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-й и последний день для данного сцепления я также посмотрел на следующее:

Exposure=ddply(HS_Hatch, "ClutchID", summarize, 
        orderfrequency = as.numeric(diff.Date(DateVisit))) 


df %>% 
    mutate(Exposure = as.Date(HS_Hatch$DateVisit, "%Y-%m-%d")) %>% 
    group_by(ClutchID) %>% 
    arrange(Exposure) %>% 
    mutate(lag=lag(DateVisit), difference=DateVisit-lag) 

Я все еще изучаю R, поэтому любая помощь будет принята с благодарностью.

Edit: Ниже приведен пример данных я использую

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

может быть «подытожить» (экспозиция = diff (диапазон (DateVisit))) '? –

+1

что @BenBolker сказал, просто добавив, что его строка «summary» должна идти после вашей строки 'group_by'. И в зависимости от класса 'DateVisit' вы можете либо оставить свою первую строку' mutate', либо изменить строку 'summary', чтобы ссылаться на' Exposure' вместо 'DateVisit'. – rosscova

ответ

2

Сбор некоторые комментарии ...

нагрузки dplyr

Нам нужен только dplyr пакет для Эта проблема. Если мы загружаем другие пакеты, например. plyr, это может вызвать конфликты, если оба пакета имеют функции с тем же именем. Загрузите только dplyr.

library(dplyr) 

В будущем вы можете загрузить tidyverse вместо этого - она ​​включает в себя dplyr и другие связанные пакеты, для графики и т.д.

Преобразование даты

Давайте преобразуем переменную DateVisit от характера строки к чему-то R могут интерпретироваться как дата. Как только мы это сделаем, он позволяет R вычислять разницу в днях, вычитая две даты друг от друга.

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

дата формат %m/%d/%Y отличается от исходного кода. Этот формат даты должен соответствовать тому, как даты выглядят в ваших данных. DateVisit имеет даты как месяц/день/год, поэтому мы используем %m/%d/%Y.

Кроме того, вам не нужно указать набор данных для DateVisit внутри mutate, как в HS_Hatch$DateVisit, так как он уже смотрит в HS_Hatch. Код HS_Hatch %>% ... говорит: «Используйте HS_Hatch для следующих шагов».

Расчет экспозиции

Для расчета воздействия, нам нужно найти первую дату, дату последнего, а затем разницу между ними, для каждого набора строк по ClutchID. Мы используем summarize, который сворачивает данные в одну строку на 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) найти минимальную date_visit для каждого ClutchID отдельно, так как мы используем group_by(ClutchID).

exposure = last_visit - first_visit принимает вновь рассчитанные first_visit и last_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 

Если вы хотите сохранить все исходные строки, вы можете использовать mutate вместо summarize.

+0

Большое вам спасибо! Я рвал волосы, пытаясь понять это. Как человек, который все еще изучает кодирование R, я ценю, что вы объясняете код шаг за шагом. Я смог понять это и следовать за ним. –

+0

Нажмите «принять», если ответ решает вашу проблему. Это поможет выразить благодарность ответчику и поможет другим найти решение в будущем. – rosscova

Смежные вопросы