【问题标题】:Subtracting a date in one column from previous unique date in another column in R从R中另一列中的先前唯一日期减去一列中的日期
【发布时间】:2021-10-11 13:20:59
【问题描述】:

我有一个如下的数据框:

ID   DPREL          Dt_biop      
292  2012-06-11    2014-03-06    
292  2013-01-10    2014-03-06
292  2015-05-21    2014-03-06
292  2017-09-05    2014-03-06
292  2012-06-11    2015-05-21   
292  2012-09-07    2015-05-21
292  2012-09-07    2017-10-26
292  2013-01-10    2017-10-26
292  2015-05-21    2017-10-26
805  2013-09-09    2020-11-19
805  2020-03-01    2020-11-19

我需要添加一个新列“Diff”,它是每个 DPREL 和之前唯一活检日期 (Dt_biop) 之间的差异,而不是前一行。事实上,新列应该是这样的:

ID   DPREL         Dt_biop       Diff
292  2012-06-11    2014-03-06    
292  2013-01-10    2014-03-06
292  2015-05-21    2014-03-06
292  2017-09-05    2014-03-06
292  2012-06-11    2015-05-21    -633
292  2012-09-07    2015-05-21    -545
292  2012-09-07    2017-10-26    -986
292  2013-01-10    2017-10-26    -861
292  2015-05-21    2017-10-26     0
805  2013-09-09    2020-11-19 
805  2020-03-01    2020-11-19

请注意,应根据每个 ID 创建差异列。我已经尝试了以下代码。

DATA2 <- DATA2 %>%
 group_by(ID) %>%
 arrange(Dt_biop) %>%
 mutate(diff = DPREL - lag(Dt_biop, default = first(DPREL)))

虽然它有效,但它计算每个 DPREL 与其前一个 Dt_biop 行之间的差异,这是不正确的。它应该计算每行中每个 DPPREL 与先前唯一的 Dt_biop 之间的差异。对于 ID 292,我们有 3 个唯一的 Dt_biop。

对于每个 ID 中的第一次活检,我不需要计算任何差异,因为没有以前的活检。因此,这些行的 diff 值应该为空。

【问题讨论】:

  • 欢迎来到 SO!如果您提供最小可重复的示例,您将最大限度地获得有用的答案。 This post 可能会有所帮助。将数据作为图像发布是一种快速结交朋友的好方法:设身处地为我们着想:我们必须先手动转录您的数据,然后才能开始为您提供帮助。当有一个简单的方法(dput())来帮助我们帮助你时,为什么我们应该这样做?
  • 嗨@Limey。正如建议的那样,我尝试添加数据框,但我不确定它的格式是否正确。请让我知道它是否可以并且我的问题是可见的。谢谢。

标签: r datediff data-preprocessing


【解决方案1】:

使用 tidyr::fill 的 tidyverse 选项。

library(dplyr)
library(tidyr)

df %>%
  group_by(ID) %>%
  mutate(date = if_else(Dt_biop > lag(Dt_biop), lag(Dt_biop), NA_Date_)) %>%
  fill(date) %>%
  mutate(diff = DPREL-date) %>%
  select(-date)

# # A tibble: 11 x 4
# # Groups:   ID [2]
#     ID   DPREL      Dt_biop    diff     
#    <int> <date>     <date>     <drtn>   
# 1    292 2012-06-11 2014-03-06   NA days
# 2    292 2013-01-10 2014-03-06   NA days
# 3    292 2015-05-21 2014-03-06   NA days
# 4    292 2017-09-05 2014-03-06   NA days
# 5    292 2012-06-11 2015-05-21 -633 days
# 6    292 2012-09-07 2015-05-21 -545 days
# 7    292 2012-09-07 2017-10-26 -986 days
# 8    292 2013-01-10 2017-10-26 -861 days
# 9    292 2015-05-21 2017-10-26    0 days
# 10   805 2013-09-09 2020-11-19   NA days
# 11   805 2020-03-01 2020-11-19   NA days

数据

df <- structure(list(ID = c(292L, 292L, 292L, 292L, 292L, 292L, 292L, 
292L, 292L, 805L, 805L), DPREL = structure(c(15502, 15715, 16576, 
17414, 15502, 15590, 15590, 15715, 16576, 15957, 18322), class = "Date"), 
    Dt_biop = structure(c(16135, 16135, 16135, 16135, 16576, 
    16576, 17465, 17465, 17465, 18585, 18585), class = "Date")), row.names = c(NA, 
-11L), class = c("tbl_df", "tbl", "data.frame"))

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 2019-03-19
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2016-07-03
    相关资源
    最近更新 更多