如何在数据框中查找每个组的日期范围
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
考虑这个数据框:
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