Вот мое предложение:
dt <-structure(list(date = structure(c(1546300800, 1546646400, 1547510400, 1547596800, 1546387200, 1546646400, 1546732800), class = c("POSIXct", "POSIXt"), tzone = "UTC"),
client = c("a", "a", "a", "a", "b", "b", "b"),
product = c("butter", "cheese", "cheese", "butter", "milk", "garbage bag", "candy"),
qty = c(2, 3, 4, 1, 3, 4, 6)), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame"))
library(data.table)
library(stringr)
dt <- as.data.table(dt)
dt[, From:=shift(product,type = "lag"), by=client]
dt <- dt[!is.na(From)]
setnames(dt, "product", "To")
dt <- dt[From!=To]
setcolorder(dt, c("client", "From", "To", "qty"))
dt[, comp:=paste0(sort(c(From, To)), collapse = "_"), by=seq_len(nrow(dt))]
dt <- unique(dt, by="comp")
dt[, date:=NULL]
dt[, comp:=NULL]
Предостережение: почему сыр был удален?Я предположил, что вы ищете последовательность различных продуктов.Если это происходит по другим причинам, мой код может потребовать некоторых настроек.
# client From To qty
# a butter cheese 3
# b milk garbage bag 4
# b garbage bag candy 6