按 ID 分组并保持最新日期
Group by ID and keep latest date
我有一个看起来像这样的数据集
ID date
1 2020-05-01
1 2020-06-13
2 2021-01-02
2 2021-01-02
3 2022-01-07
3 2021-12-14
等等。我的数据集中大约有 30 个变量。我想按 ID 分组,并重写 df$date 以便每个 ID 只保留最新日期:
ID date
1 2020-06-13
1 2020-06-13
2 2021-01-02
2 2021-01-02
3 2022-01-07
3 2022-01-07
日期格式为“%Y-%m-%d”
我们可以使用 max(date)
和 mutate
:
library(dplyr)
library(lubridate)
df %>%
mutate(date = ymd(date)) %>% # need only to transform to date class
group_by(ID) %>%
mutate(date = max(date))
ID date
<int> <date>
1 1 2020-06-13
2 1 2020-06-13
3 2 2021-01-02
4 2 2021-01-02
5 3 2022-01-07
6 3 2022-01-07
您可以使用 if_else
语句来检查最新日期,并替换任何不是最新的日期。
library(dplyr)
df %>%
group_by(ID) %>%
mutate(date = if_else(date == max(date), as.Date(date), as.Date(max(date))))
# A tibble: 6 × 2
# Groups: ID [3]
ID date
<int> <date>
1 1 2020-06-13
2 1 2020-06-13
3 2 2021-01-02
4 2 2021-01-02
5 3 2022-01-07
6 3 2022-01-07
如果您的目的只是保留每组最近日期的行,则可以不用 group_by
。
df %>%
arrange(ID, desc(date)) %>%
distinct(ID, .keep_all = T)
ID date
1 1 2020-06-13
2 2 2021-01-02
3 3 2022-01-07
这就是 data.table
语法的亮点。
library(data.table)
setDT(mydata)[, date := max(date), by = ID]
# ID date
# 1: 1 2020-06-13
# 2: 1 2020-06-13
# 3: 2 2021-01-02
# 4: 2 2021-01-02
# 5: 3 2022-01-07
# 6: 3 2022-01-07
我有一个看起来像这样的数据集
ID date
1 2020-05-01
1 2020-06-13
2 2021-01-02
2 2021-01-02
3 2022-01-07
3 2021-12-14
等等。我的数据集中大约有 30 个变量。我想按 ID 分组,并重写 df$date 以便每个 ID 只保留最新日期:
ID date
1 2020-06-13
1 2020-06-13
2 2021-01-02
2 2021-01-02
3 2022-01-07
3 2022-01-07
日期格式为“%Y-%m-%d”
我们可以使用 max(date)
和 mutate
:
library(dplyr)
library(lubridate)
df %>%
mutate(date = ymd(date)) %>% # need only to transform to date class
group_by(ID) %>%
mutate(date = max(date))
ID date
<int> <date>
1 1 2020-06-13
2 1 2020-06-13
3 2 2021-01-02
4 2 2021-01-02
5 3 2022-01-07
6 3 2022-01-07
您可以使用 if_else
语句来检查最新日期,并替换任何不是最新的日期。
library(dplyr)
df %>%
group_by(ID) %>%
mutate(date = if_else(date == max(date), as.Date(date), as.Date(max(date))))
# A tibble: 6 × 2
# Groups: ID [3]
ID date
<int> <date>
1 1 2020-06-13
2 1 2020-06-13
3 2 2021-01-02
4 2 2021-01-02
5 3 2022-01-07
6 3 2022-01-07
如果您的目的只是保留每组最近日期的行,则可以不用 group_by
。
df %>%
arrange(ID, desc(date)) %>%
distinct(ID, .keep_all = T)
ID date
1 1 2020-06-13
2 2 2021-01-02
3 3 2022-01-07
这就是 data.table
语法的亮点。
library(data.table)
setDT(mydata)[, date := max(date), by = ID]
# ID date
# 1: 1 2020-06-13
# 2: 1 2020-06-13
# 3: 2 2021-01-02
# 4: 2 2021-01-02
# 5: 3 2022-01-07
# 6: 3 2022-01-07