我有一个看起来像的数据集
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";
您可以使用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
我们可以将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
如果只保留每个组中具有最新日期的行是您的目的,那么您可以不使用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