Пример моего набора данных приведен ниже:
| id | Date | Buyer |
|:--:|-----------:|----------|
| 9 | 11/29/2018 | Jenny |
| 9 | 11/29/2018 | Jenny |
| 9 | 11/29/2018 | Jenny |
| 4 | 5/30/2018 | Chang |
| 4 | 7/4/2018 | Chang |
| 4 | 8/17/2018 | Chang |
| 5 | 5/25/2018 | Chunfei |
| 5 | 2/13/2019 | Chunfei |
| 5 | 2/16/2019 | Chunfei |
| 5 | 2/16/2019 | Chunfei |
| 5 | 2/23/2019 | Chunfei |
| 5 | 2/25/2019 | Chunfei |
| 8 | 2/28/2019 | Chunfei |
| 8 | 2/28/2019 | Chunfei |
У меня есть два блока вопросов по этому набору данных:
- Мне нужно рассчитать разницу между датами, но эта разница будет рассчитываться на основе группировки «Покупатель» и «идентификатор», что означает, что разница в датах для покупателя «Дженни» и идентификатора «9» будет одной группой, покупатель «Чанг». 'с идентификатором' 4 'будет другой группой, а покупатель' Chunfei 'с идентификатором' 5 'будет другой группой, а' Chunfei 'с идентификатором' 8 'будет другой группой. Итак, на выходе получится:
| id | Date | Buyer_id | Diff |
|:--:|-----------:|----------|------|
| 9 | 11/29/2018 | Jenny | NA |
| 9 | 11/29/2018 | Jenny | 0 |
| 9 | 11/29/2018 | Jenny | 0 |
| 4 | 5/30/2018 | Chang | NA |
| 4 | 7/4/2018 | Chang | 35 |
| 4 | 8/17/2018 | Chang | 44 |
| 5 | 5/25/2018 | Chunfei | NA |
| 5 | 2/13/2019 | Chunfei | 264 |
| 5 | 2/16/2019 | Chunfei | 3 |
| 5 | 2/16/2019 | Chunfei | 0 |
| 5 | 2/23/2019 | Chunfei | 7 |
| 5 | 2/25/2019 | Chunfei | 2 |
| 8 | 2/28/2019 | Chunfei | NA |
| 8 | 2/28/2019 | Chunfei | 0 |
Проблема в том, что я не понимаю, почему group_by не работает. Следующий код вычитает последовательные строки, а не группирует их для одного и того же покупателя и идентификатора, а затем вычитает.
df=data.frame(id=c("9","9","9","4","4","4","5","5","5","5","5","5","8","8"),
Date=c("11/29/2018","11/29/2018","11/29/2018","5/30/2018","7/4/2018",
"8/17/2018","5/25/2018","2/13/2019","2/16/2019","2/16/2019","2/23/2019",
"2/25/2019","2/28/2019","2/28/2019"),Buyer=c("Jenny","Jenny","Jenny",
"Chang","Chang","Chang","Chunfei","Chunfei","Chunfei","Chunfei","Chunfei",
"Chunfei","Chunfei","Chunfei"))
df$id=as.numeric(as.character(df$id))
df$Date=as.Date(df$Date, "%m/%d/%Y")
df$Buyer=as.character(df$Buyer)
df1=df %>% group_by(Buyer,id) %>%
mutate(diff=as.numeric(difftime(Date,lag(Date),units='days')))
- После вычисления разницы дат мне нужно отфильтровать те записи, разница между датами которых составляет 5 дней. В приведенном выше примере разница дат между "25.05.2018", "13.02.2019", "16.02.2019", "16.02.2019", "23.02.2019", " 25.02.2019 »будет NA, 264,3,0,7,2. Однако, если я предоставлю фильтр для n ‹6, я пропущу даты« 13.02.2019 »и« 23.02.2019 ». Эти даты важно сохранить в окончательном выводе, потому что, хотя разница между датами «13.02.2019» и «25.05.2018» составляет 264, разница между «16.02.2019» и «2» / 13/2019 "равно 3. Точно так же, хотя разница между" 16.02.2019 "и" 23.02.2019 "равна 7, разница между" 23.02.2019 "и" 25.02.2019 " "равно 2. Итак, мне нужно сохранить эти даты. Как этого добиться?
Мы можем замаскировать столбец 'diff' в окончательном выводе, и он должен выглядеть, как показано ниже:
| id | Date | Buyer_id |
|----|:----------:|---------:|
| 9 | 11/29/2018 | Jenny |
| 9 | 11/29/2018 | Jenny |
| 9 | 11/29/2018 | Jenny |
| 5 | 2/13/2019 | Chunfei |
| 5 | 2/16/2019 | Chunfei |
| 5 | 2/16/2019 | Chunfei |
| 5 | 2/23/2019 | Chunfei |
| 5 | 2/25/2019 | Chunfei |
| 8 | 2/28/2019 | Chunfei |
| 8 | 2/28/2019 | Chunfei |