gpt4 book ai didi

r - 在 R 中按组计算日期之间的差异

转载 作者:行者123 更新时间:2023-12-03 22:35:51 25 4
gpt4 key购买 nike

我正在使用逻辑暴露来计算鸟巢的孵化成功率。我的数据集非常广泛,我有大约 2,000 个巢穴,每个巢穴都有一个唯一的 ID(“ClutchID”)。我需要计算给定巢穴暴露的天数(“暴露”),或者更简单地说,是第一天也是最后一天。我使用了以下代码:

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"))

最佳答案

收集一些评论...

负载 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_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

如果要保留所有原始行,可以使用 mutate代替 summarize .

关于r - 在 R 中按组计算日期之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40570221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com