2016-11-13 1 views
2

Ich verwende eine logistische Exposition, um den Brut-Erfolg für Vogelnester zu berechnen. Mein Datensatz ist ziemlich umfangreich und ich habe ~ 2000 Nester mit jeweils einer eindeutigen ID ("ClutchID"). Ich muss die Anzahl der Tage berechnen, die ein bestimmtes Nest ausgesetzt war ("Exposure"), oder einfacher gesagt, den Unterschied zwischen den . 1. und letzten Tag habe ich den folgenden Code:Berechne den Unterschied zwischen den Daten nach Gruppe in 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]} 

wo HS_Hatch ist mein Dataset und DateVisit ist das tatsächliche Datum das einzige Problem ist, R einen Belichtungswert für das erste Datum ist die Berechnung (was nicht macht. .. Sinn)

Was ich brauche, ist für die Berechnung der Differenz zwischen dem ersten und letzten Termin für eine gegebene Kupplung wirklich habe ich sah auch in den folgenden:

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) 

Ich lerne immer noch R so jede Hilfe würde sehr geschätzt werden.

Edit: Unten finden Sie eine Probe der Daten-I

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

Willkommen bei Stack Overflow! Können Sie bitte Daten angeben, die uns ein [reproduzierbares Beispiel] liefern (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? –

+3

vielleicht zusammenfassen (Belichtung = diff (Bereich (DatumVisit)))? –

+1

was @BenBolker gesagt hat, nur um hinzuzufügen, dass seine 'summarise' Zeile nach Ihrer' group_by' Zeile gehen soll. Und abhängig von der Klasse "DateVisit" können Sie entweder Ihre erste "mutierte" Zeile verlassen oder die "summarise" Zeile ändern, um "Exposure" anstatt "DateVisit" zu referenzieren. – rosscova

Antwort

2

Sammeln einige der Kommentare bin mit ...

Last dplyr

Wir brauchen nur die dplyr Paket für dieses Problem. Wenn wir andere Pakete laden, z. plyr kann es Konflikte verursachen, wenn beide Pakete Funktionen mit demselben Namen haben. Laden wir nur dplyr.

library(dplyr) 

In Zukunft können Sie möchten tidyverse stattdessen laden - es dplyr und andere damit zusammenhängende Pakete enthält, für Grafiken etc.

Converting Daten

Lassen Sie uns die DateVisit Variable aus Zeichen umwandeln Strings zu etwas R kann als Datum interpretieren. Sobald wir dies getan haben, erlaubt es R, Differenzen in Tagen zu berechnen, indem zwei Daten voneinander subtrahiert werden.

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

Das Datumsformat %m/%d/%Y unterscheidet sich von Ihrem ursprünglichen Code. Dieses Datumsformat muss mit den Datumsangaben in Ihren Daten übereinstimmen. DateVisit hat Daten als Monat/Tag/Jahr, also verwenden wir %m/%d/%Y.

Auch brauchen Sie nicht den Datensatz für DateVisit innerhalb mutate, wie in HS_Hatch$DateVisit angeben, da es bereits in HS_Hatch sucht. Der Code HS_Hatch %>% ... sagt "Verwenden Sie HS_Hatch für die folgenden Schritte".

Berechnung Belichtungen

Exposition zu berechnen, müssen wir das erste Datum, letztes Datum finden, und dann die Differenz zwischen den beide, für jeden Satz von Reihen von ClutchID. Wir verwenden summarize, die die Daten zu einer Zeile pro ClutchID zusammenfasst.

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) wird die minimale date_visit für jede ClutchID separat finden, da wir group_by(ClutchID) verwenden.

exposure = last_visit - first_visit nimmt die neu berechneten first_visit und last_visit und findet den Unterschied in Tagen.

Dies erzeugt das folgende Ergebnis:

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 

Wenn Sie alle ursprünglichen Reihen halten möchten, können Sie mutate anstelle von summarize verwenden können.

+0

Vielen Dank! Ich habe mir die Haare ausgerissen, um das herauszufinden. Als jemand, der immer noch R-Codierung lernt, schätze ich es, wenn Sie den Code Schritt für Schritt erklären. Ich konnte es verstehen und folgen. –

+0

Klicken Sie auf "Akzeptieren", wenn die Antwort Ihr Problem löst. Dies hilft, dem Antwortenden zu danken und anderen zu helfen, die Lösung in der Zukunft zu finden. – rosscova

Verwandte Themen