如何在数据框中查找每个组的日期范围

How to find the range of dates for each group in a dataframe

考虑这个数据框:

data <- data.frame(group = rep(letters[1:3], c(4,5,4)),
                Date = as.Date(c("2010-08-09", "2010-09-11", "2010-09-12", "2010-09-18",
                                 "2014-03-15","2014-03-16","2014-03-20","2014-03-21","2014-03-25",
                                 "2016-05-02","2016-08-02","2016-08-03","2016-09-21")))

我们分为三组,他们在不同的日期进行了观察。我想找到每个组的第一个和最后一个日期(最好使用 dplyr)。如何使用日期完成此操作?

编辑: 我添加这个是为了澄清我提问的原因,这与 R 解释实时(日期)的能力有关。 data2 将与上面的 data 完全相同,但请注意我调换了前两个日期,因此 group==a 的观察结果不再按实际时间顺序排列(从最早到最晚, 相对于实时):

data2 <- data.frame(group = rep(letters[1:3], c(4,5,4)),
                Date = as.Date(c("2010-09-11","2010-08-09", "2010-09-12", "2010-09-18",
                                 "2014-03-15","2014-03-16","2014-03-20","2014-03-21","2014-03-25",
                                 "2016-05-02","2016-08-02","2016-08-03","2016-09-21")))

因此,2010 年 9 月 11 日晚于 2010 年 8 月 9 日(实时),但它们在数据框中的时间顺序不一致。 现在如果我们这样做:

library(dplyr)
data2%>%group_by(group) %>% summarise(FirsDate=first(Date),LastDate=last(Date))

我们得到:

  group FirsDate   LastDate  
  <fct> <date>     <date>    
1 a     2010-09-11 2010-09-18
2 b     2014-03-15 2014-03-25
3 c     2016-05-02 2016-09-21

所以它返回了第一个和最后一个观察结果,而不是真正的时间顺序。

我建议使用 dplyr 包中的 first()last() 函数的方法:

library(dplyr)
#Data
data <- data.frame(group = rep(letters[1:3], c(4,5,4)),
                   Date = as.Date(c("2010-08-09", "2010-09-11", "2010-09-12", "2010-09-18",
                                    "2014-03-15","2014-03-16","2014-03-20","2014-03-21","2014-03-25",
                                    "2016-05-02","2016-08-02","2016-08-03","2016-09-21")))
#Code
data %>% group_by(group) %>% mutate(FirsDate=first(Date),LastDate=last(Date))

输出:

# A tibble: 13 x 4
# Groups:   group [3]
   group Date       FirsDate   LastDate  
   <fct> <date>     <date>     <date>    
 1 a     2010-08-09 2010-08-09 2010-09-18
 2 a     2010-09-11 2010-08-09 2010-09-18
 3 a     2010-09-12 2010-08-09 2010-09-18
 4 a     2010-09-18 2010-08-09 2010-09-18
 5 b     2014-03-15 2014-03-15 2014-03-25
 6 b     2014-03-16 2014-03-15 2014-03-25
 7 b     2014-03-20 2014-03-15 2014-03-25
 8 b     2014-03-21 2014-03-15 2014-03-25
 9 b     2014-03-25 2014-03-15 2014-03-25
10 c     2016-05-02 2016-05-02 2016-09-21
11 c     2016-08-02 2016-05-02 2016-09-21
12 c     2016-08-03 2016-05-02 2016-09-21
13 c     2016-09-21 2016-05-02 2016-09-21

如果你只想要每个组的变量,你可以使用 summarise():

#Code2
data %>% group_by(group) %>% summarise(FirsDate=first(Date),LastDate=last(Date))

输出:

# A tibble: 3 x 3
  group FirsDate   LastDate  
  <fct> <date>     <date>    
1 a     2010-08-09 2010-09-18
2 b     2014-03-15 2014-03-25
3 c     2016-05-02 2016-09-21

更新:

#Code
data2 %>% group_by(group) %>% summarise(FirsDate=min(Date),LastDate=max(Date))

输出:

# A tibble: 3 x 3
  group FirsDate   LastDate  
  <fct> <date>     <date>    
1 a     2010-08-09 2010-09-18
2 b     2014-03-15 2014-03-25
3 c     2016-05-02 2016-09-21

您可以尝试另一种方法

library(dplyr)
data2 <- data %>% 
  group_by(group) %>% 
  filter(row_number()==1 | row_number()==n()) %>% 
  ungroup()
#   group Date      
# <chr> <date>    
# 1 a     2010-08-09
# 2 a     2010-09-18
# 3 b     2014-03-15
# 4 b     2014-03-25
# 5 c     2016-05-02
# 6 c     2016-09-21