从R中另一列中的先前唯一日期减去一列中的日期
Subtracting a date in one column from previous unique date in another column in R
我有一个数据框如下:
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 中的第一次活检,我不需要计算任何差异,因为没有之前的活检。因此,这些行的差异值应该为空。
使用 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"))
我有一个数据框如下:
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 中的第一次活检,我不需要计算任何差异,因为没有之前的活检。因此,这些行的差异值应该为空。
使用 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"))