按 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