首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按组计算两个日期之间的差异,但有警告

按组计算两个日期之间的差异,但有警告
EN

Stack Overflow用户
提问于 2022-01-20 01:18:58
回答 2查看 216关注 0票数 0

数据如下:

代码语言:javascript
复制
df <- data.frame(
  id = c(283,994,294,294,1001,1001), 
  stint = c(1,1,1,2,1,2), 
  admit = c("2010-2-3","2011-2-4","2011-3-4","2012-4-1","2016-1-2","2017-2-3"),
  release = c("2011-2-3","2011-2-28","2011-4-1","2014-6-6","2017-2-1","2018-3-1")
)

好吧,所以请原谅我,因为我觉得这种话很难表达。我需要计算第一个阶段的发布日期与第二个阶段的承认日期之间的差异。因此,我称之为“暴露”的差异对于上面的示例应该是这样的

代码语言:javascript
复制
exposure=c(NA,NA,365,NA,2,NA)

因此,如果只有一段时间,安娜将被退回,如果超过一次,曝光时间将使用先前的发布日期和当前的承认日期计算。所以,第三阶段的暴露将是第三阶段的承认--第二阶段的发布。

EN

回答 2

Stack Overflow用户

发布于 2022-01-20 04:10:17

如果stint == 2,则要计算曝光量,否则返回NA。这可以用ifelse来完成。但是,您希望从上一个发布日期开始发布。这可以用滞后来完成。但这将使暴露值与承认暴露==2相关联,而您希望暴露与计算中使用的前一个版本相关联。所以,去掉第一次曝光值,最后加上安娜。

代码语言:javascript
复制
  df %>% 
    mutate(across(c(admit, release), as.Date), 
           exposure = c(ifelse(stint == 2, admit - lag(release), NA)[-1], NA))

产额

代码语言:javascript
复制
    id stint      admit    release exposure
1  283     1 2010-02-03 2011-02-03       NA
2  994     1 2011-02-04 2011-02-28       NA
3  294     1 2011-03-04 2011-04-01      366
4  294     2 2012-04-01 2014-06-06       NA
5 1001     1 2016-01-02 2017-02-01        2
6 1001     2 2017-02-03 2018-03-01       NA
票数 1
EN

Stack Overflow用户

发布于 2022-01-20 02:07:54

下面是一种dplyr方法。我们将找到admit (release)的值,其中stint为2 (1),取差值,并将暴露的第一项替换为每组id的第一项。

代码语言:javascript
复制
library(dplyr)

df %>% 
  mutate(
    across(c(admit, release), as.Date), 
    exposure = NA_integer_
  ) %>% 
  group_by(id) %>% 
  mutate(exposure = replace(
    exposure, 1L, 
    as.integer(admit[match(2, stint)] - release[match(1, stint)])
  ))

输出

代码语言:javascript
复制
# A tibble: 6 x 5
# Groups:   id [4]
     id stint admit      release    exposure
  <dbl> <dbl> <date>     <date>        <int>
1   283     1 2010-02-03 2011-02-03       NA
2   994     1 2011-02-04 2011-02-28       NA
3   294     1 2011-03-04 2011-04-01      366
4   294     2 2012-04-01 2014-06-06       NA
5  1001     1 2016-01-02 2017-02-01        2
6  1001     2 2017-02-03 2018-03-01       NA
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70779742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档