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

问题描述

考虑此数据框:

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],Date = as.Date(c("2010-09-11","2010-08-09","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

因此它返回的第一个和最后一个观测值不是按真实的时间顺序。

解决方法

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...