Создание колонки владения в Days in R
* Отредактировано
Я пытаюсь создать столбец в df, который показывает номер дня в клиентском владении. Вот код для создания макета DF для этого:-
Date<-c("20/07/2018", "21/07/2018", "25/07/2018", "02/08/2018", "05/08/2018", "10/08/2018")
ClientId<-c("aaa", "bbb", "ccc", "aaa", "bbb", "ccc")
EventId<-c("klk109", "rrt234", "hjk786", "yyu777", "tyw909", "nnl991")
dateclient<-cbind(Date, ClientId)
LoginDates<-cbind(dateclient, EventId)
View(LoginDates)
что должно дать вам что-то вроде этого:
head(LoginDates)
Date ClientId EventId
"20/07/2018" "aaa" "klk109"
"21/07/2018" "bbb" "rrt234"
"25/07/2018" "ccc" "hjk786"
"02/08/2018" "aaa" "yyu777"
"05/08/2018" "bbb" "tyw909"
"10/08/2018" "ccc" "nnl991"
По сути, я хочу создать столбец, чтобы добавить в конец, как это
Date ClientId EventId tenureDay
"20/07/2018" "aaa" "klk109" 1
"21/07/2018" "bbb" "rrt234" 1
"25/07/2018" "ccc" "hjk786" 1
"02/08/2018" "aaa" "yyu777" 13
"05/08/2018" "bbb" "tyw909" 15
"10/08/2018" "ccc" "nnl991" 16
Тем не менее, моя главная проблема в моем наборе данных (вышеприведенное - фиктивный df), у некоторых клиентов было более одного взаимодействия в день (у некоторых было 10, 20 и так далее). Код, который я написал (цикл for и некоторый код data.table), возвратил количество взаимодействий (или EventIds), а не число дней в сроке пребывания. Если клиент находился в службе в течение 10 дней и имел, скажем, 4 взаимодействия за это время, я хочу, чтобы столбец tenureDay представлял день в их сроке службы, в который произошло конкретное взаимодействие.
Надеюсь, что это имеет смысл, большое спасибо заранее!:)
1 ответ
Спасибо за изменение вопроса!
Для воспроизводства:
LoginDates <- fread("Date ClientId EventId
2018-07-20 aaa klk109
2018-07-21 bbb rrt234
2018-07-25 ccc hjk786
2018-08-02 aaa yyu777
2018-08-05 bbb tyw909
2018-08-10 ccc nnl991")
С помощью dplyr
Вы можете попробовать это:
LoginDates %>%
group_by(ClientId) %>%
mutate(tenureDay = as.Date(Date) - head(as.Date(Date),1))
Я очень надеюсь, что это решит вашу проблему!
РЕДАКТИРОВАТЬ:
Если вы не хотите, чтобы ваш результат отображался как x Days
тогда попробуйте:
LoginDates %>%
group_by(ClientId) %>%
mutate(tenureDay = as.numeric(as.Date(Date) - head(as.Date(Date),1)))