r-按ID分组并保留最新日期



我有一个看起来像的数据集

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

最新更新