我正在嘗試計算客戶的逗留時間;這不是資料中的欄位,但每一行都是單獨的一天,連續天屬于同一“停留” - 因此,如果同一客戶有 5 行連續天,則他們的停留時間將為 5天。然而,有很多不同的客戶,每個客戶可能有不止一次的住宿——如果服務日期不連續,他們將被視為單獨的住宿。例如:
| 客戶編號 | 服務日期 |
|---|---|
| 123 | 22 年 1 月 1 日 |
| 123 | 22 年 1 月 2 日 |
| 123 | 22 年 1 月 3 日 |
| 123 | 22 年 1 月 4 日 |
| 123 | 22 年 1 月 5 日 |
| 456 | 22 年 1 月 1 日 |
| 456 | 22 年 1 月 4 日 |
| 456 | 22 年 1 月 5 日 |
| 456 | 22 年 1 月 6 日 |
| 789 | 22 年 1 月 1 日 |
| 789 | 22 年 1 月 2 日 |
| 789 | 22 年 1 月 5 日 |
| 789 | 22 年 1 月 6 日 |
| 789 | 22 年 1 月 9 日 |
| 789 | 22 年 1 月 10 日 |
對于這個虛假資料,客戶“123”將停留 1 次,停留時間為 5 天;客戶“456”將入住 2 次,一次入住 1 天,另一次入住 3 天;客戶“789”將入住 3 次,每次入住 2 天。
我的計劃是按客戶 ID 對資料進行分組,然后按服務日期排序,然后可能使用某種 for 回圈來檢查服務日期是否在 1 天后,如果是,將其添加到留下來,如果不是,開始新的“住宿”;但這似乎笨重且效率低下,我不完全確定它會正常作業。資料中有數千行和數百個客戶端。
理想情況下,我的輸出將提供客戶 ID 和他們計算的逗留時間;如果可能的話,最好讓輸出也提供每次住宿的開始日期。
有沒有辦法在 R 中實作這一點?
感謝您提供的任何幫助。謝謝!
uj5u.com熱心網友回復:
我們可能會使用
library(dplyr)
library(lubridate)
df1 %>%
mutate(dateofservice = mdy(dateofservice)) %>%
group_by(clientid) %>%
mutate(grp = cumsum(c(TRUE, diff(dateofservice) != 1))) %>%
group_by(grp, .add = TRUE) %>%
summarise(len = n(), start_date = first(dateofservice), .groups = 'drop')
-輸出
# A tibble: 6 × 4
clientid grp len start_date
<int> <int> <int> <date>
1 123 1 5 2022-01-01
2 456 1 1 2022-01-01
3 456 2 3 2022-01-04
4 789 1 2 2022-01-01
5 789 2 2 2022-01-05
6 789 3 2 2022-01-09
資料
df1 <- structure(list(clientid = c(123L, 123L, 123L, 123L, 123L,
456L,
456L, 456L, 456L, 789L, 789L, 789L, 789L, 789L, 789L),
dateofservice = c("1/1/22",
"1/2/22", "1/3/22", "1/4/22", "1/5/22", "1/1/22", "1/4/22", "1/5/22",
"1/6/22", "1/1/22", "1/2/22", "1/5/22", "1/6/22", "1/9/22", "1/10/22"
)), class = "data.frame", row.names = c(NA, -15L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470830.html
