Другой data.table
подход. Сначала отсортируйте данные так, чтобы первая дата была самой ранней, а затем мы можем использовать первый индикатор для проверки условия. Затем преобразуйте логическое в целое число (FALSE
-> 1
и TRUE
-> 2
) и отобразите в нужный вывод, используя вектор символов.
library(data.table)
setDT(df)
setorder(df, id, date)
map <- c("Customer without x in first order", "Customer with X in first order")
df[, idx := 1L+any(indicator[1L]==1L), by=.(id)][,
First_Order_contains_x := map[idx]]
Если важен исходный заказ, мы можем сохранить исходный заказ, используя df[, rn := .I]
, и, наконец, setorder(df, rn)
.
данные:
set.seed(0L)
id <- round(rnorm(3000, mean = 5000, 5),0)
date <- seq.Date(as.Date("2018-01-01"), as.Date("2018-12-31"), "day")
date <- sample(date, length(id), replace = TRUE)
indicator <- rbinom(length(id), 1, 0.5)
df <- data.frame(id, date, indicator)
df$id <- as.factor(df$id)