2016-11-13 134 views
2

我使用后勤风险来计算鸟巢的孵化成功率。我的数据集非常广泛,我有大约2,000个巢,每个巢都有一个唯一的ID(“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代表的第一个日期计算的曝光值(不使。 。感)

我真正需要的是计算第一和最后日期为给定的离合器之间的区别,我也看着下面:

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,所以任何帮助将不胜感激。

编辑: 下面是数据的样本我使用

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

欢迎来到Stack Overflow!你可以请包括数据,将提供给我们一个[可重现的例子](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? –

+3

也许'summarize(exposure = diff(range(DateVisit)))'? –

+1

@BenBolker说了些什么,只是补充说他的'summarise'行应该在你的'group_by'行之后。根据“DateVisit”的类别,您可以放弃第一个“mutate”行,或将“summarise”行更改为引用“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)找到每个ClutchID最低date_visit分开,因为我们使用group_by(ClutchID)

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