Вы можете group_by(ID, amt, status)
, а затем mutate
date, чтобы содержать все даты, разделенные |
.
library(tidyverse)
df %>%
group_by(ID, amt, status) %>%
mutate(date = paste(date, collapse = "|")) %>%
distinct()
Output
ID amt status date
<fct> <int> <fct> <chr>
1 A 1000 A 2019-01-01|2019-02-01
2 B 1000 I 2019-01-01
3 B 3000 A 2019-02-01|2019-03-01
Или базовая опция R:
aggregate(date ~ ID + amt + status, df, paste, collapse = "|")
или data.table
:
data.table(df)[,lapply(.SD, paste, collapse = "|"), .(ID, amt, status)]