对于每个 ID,返回 r 中开始列的最早日期和结束列的最新日期

Posted

技术标签:

【中文标题】对于每个 ID,返回 r 中开始列的最早日期和结束列的最新日期【英文标题】:For each ID return the earliest date from the start column and the latest date from the end column in r 【发布时间】:2022-01-03 21:52:06 【问题描述】:

我有一个数据集,其中每个 ID 都有多个开始日期和结束日期。我想从“startDate”列中获取最早的日期,从 endDate 列中获取最晚的日期。


data = data.frame(ID=c(1,1,1,1,2,2,2),
                  startDate= c("2018-01-31", "2018-01-31", "2018-01-31", "2019-06-06",
                          "2002-06-07", "2002-06-07", "2002-09-12"),
                  endDate = c(NA,NA,NA,"2019-07-09",NA,NA, "2002-10-02"))

这是我希望得到的输出:

data = data.frame(ID=c(1,2),
                  startDate= c("2018-01-31","2002-06-07"),
                  endDate = c("2019-07-09","2002-10-02"))

经过尝试,我已经通过以下代码弄清楚了如何做到这一点,但如果可能的话,我更喜欢更高效的方法。我一直需要这样做,我宁愿不必创建两个单独的数据框。谢谢大家的帮助!

data_start <- data %>%
          group_by(ID) %>%
          arrange(startDate) %>%
             slice(1L)

data_end <- data %>%
  group_by(ID) %>%
  arrange(desc(endDate)) %>%
  slice(1L)

data <- left_join(data_start[,c(1,2)], data_end[,c(1,3)], by="ID")

【问题讨论】:

【参考方案1】:

或者用firstlast

library(dplyr)
data %>% 
  group_by(ID) %>%
  summarise(
    startDate = first(startDate),
    endDate = last(endDate)
  )
# A tibble: 2 x 3
     ID startDate  endDate   
* <dbl> <chr>      <chr>     
1     1 2018-01-31 2019-07-09
2     2 2002-06-07 2002-10-02

【讨论】:

完美运行 - 非常感谢! 那么请考虑接受和/或支持该帖子【参考方案2】:

您可以使用最小值和最大值,将变量用作日期

 data %>% group_by(ID) %>% 
      summarise(startDate = min(as.Date(startDate),na.rm = T),
                endDate = max(as.Date(endDate),na.rm = T))

【讨论】:

以上是关于对于每个 ID,返回 r 中开始列的最早日期和结束列的最新日期的主要内容,如果未能解决你的问题,请参考以下文章

在不同的表中返回最近的日期

如何返回最早日期的记录?

根据条件按 ID 组合重叠日期

Oracle SQL - 具有 NULL 值的 max()

r中最早的日期和ID的条件

MS Access:按开始日期和结束日期之间每个月的月份分组