根据时间间隔汇总
Summarize based on time between
我正在尝试根据组内的时间间隔来汇总数据集。基本上我所拥有的是,就像这个例子,一个学生购买课程的数据集,课程有级别:1 到 5,每门课程大约 2 个月,学生可以只学习 1 到 5 的课程。我想分析当学生:
- 辍学。那就是,当他们在 2 个月后还没有购买新课程时
- 最后一门课程是什么,他们已经 2 个月没有购买课程了
- 如果他们在停止后决定再次继续
我的数据集示例是这样的:
> data
Student Buy_Date Course
A 01-01-2019 Level 1
A 01-03-2019 Level 2
A 01-05-2019 Level 3
A 01-07-2019 Level 4
B 01-01-2019 Level 1
B 01-03-2019 Level 2
B 01-09-2019 Level 3
我想要的结果是:
> Data_Result
Student First_Buy First_Course Last_Course Stopped_Date Continued? Course_Continued
A 01-01-2019 Level 1 Level 4 01-07-2019 No NA
B 01-01-2019 Level 1 Level 2 01-03-2019 Yes Level 3
我曾尝试搜索 this 之类的选项,但我没有更进一步:根据时间对组内的行进行排序并计算前一个之间的时间。但是在那之后我卡住了..有人可以帮助我吗?
这是一种获得预期输出的方法。这里的关键是计算两个日期之间的月数 (Diff_Months
)。之后,可以总结每个变量。
library(tidyverse)
library(lubridate)
df %>%
group_by(Student) %>%
mutate(Buy_Date = dmy(Buy_Date),
Diff_Months = abs((interval(Buy_Date, lag(Buy_Date, default = first(Buy_Date))) %/% months(1)))) %>%
summarise(First_Buy = first(Buy_Date),
First_Course = first(Course),
Last_Course = last(Course[Diff_Months <= 2]),
Stopped_Date = Buy_Date[Course == Last_Course],
Continued = ifelse(Last_Course == last(Course), "No", "Yes"),
Course_Continued = ifelse(Continued == "Yes", last(Course), NA))
# A tibble: 2 x 7
Student First_Buy First_Course Last_Course Stopped_Date Continued Course_Continued
<chr> <date> <chr> <chr> <date> <chr> <chr>
1 A 2019-01-01 Level 1 Level 4 2019-07-01 No NA
2 B 2019-01-01 Level 1 Level 2 2019-03-01 Yes Level 3
数据
df <- read.table(header = T, text = "Student Buy_Date Course
A 01-01-2019 'Level 1'
A 01-03-2019 'Level 2'
A 01-05-2019 'Level 3'
A 01-07-2019 'Level 4'
B 01-01-2019 'Level 1'
B 01-03-2019 'Level 2'
B 01-09-2019 'Level 3'")
我正在尝试根据组内的时间间隔来汇总数据集。基本上我所拥有的是,就像这个例子,一个学生购买课程的数据集,课程有级别:1 到 5,每门课程大约 2 个月,学生可以只学习 1 到 5 的课程。我想分析当学生:
- 辍学。那就是,当他们在 2 个月后还没有购买新课程时
- 最后一门课程是什么,他们已经 2 个月没有购买课程了
- 如果他们在停止后决定再次继续
我的数据集示例是这样的:
> data
Student Buy_Date Course
A 01-01-2019 Level 1
A 01-03-2019 Level 2
A 01-05-2019 Level 3
A 01-07-2019 Level 4
B 01-01-2019 Level 1
B 01-03-2019 Level 2
B 01-09-2019 Level 3
我想要的结果是:
> Data_Result
Student First_Buy First_Course Last_Course Stopped_Date Continued? Course_Continued
A 01-01-2019 Level 1 Level 4 01-07-2019 No NA
B 01-01-2019 Level 1 Level 2 01-03-2019 Yes Level 3
我曾尝试搜索 this 之类的选项,但我没有更进一步:根据时间对组内的行进行排序并计算前一个之间的时间。但是在那之后我卡住了..有人可以帮助我吗?
这是一种获得预期输出的方法。这里的关键是计算两个日期之间的月数 (Diff_Months
)。之后,可以总结每个变量。
library(tidyverse)
library(lubridate)
df %>%
group_by(Student) %>%
mutate(Buy_Date = dmy(Buy_Date),
Diff_Months = abs((interval(Buy_Date, lag(Buy_Date, default = first(Buy_Date))) %/% months(1)))) %>%
summarise(First_Buy = first(Buy_Date),
First_Course = first(Course),
Last_Course = last(Course[Diff_Months <= 2]),
Stopped_Date = Buy_Date[Course == Last_Course],
Continued = ifelse(Last_Course == last(Course), "No", "Yes"),
Course_Continued = ifelse(Continued == "Yes", last(Course), NA))
# A tibble: 2 x 7
Student First_Buy First_Course Last_Course Stopped_Date Continued Course_Continued
<chr> <date> <chr> <chr> <date> <chr> <chr>
1 A 2019-01-01 Level 1 Level 4 2019-07-01 No NA
2 B 2019-01-01 Level 1 Level 2 2019-03-01 Yes Level 3
数据
df <- read.table(header = T, text = "Student Buy_Date Course
A 01-01-2019 'Level 1'
A 01-03-2019 'Level 2'
A 01-05-2019 'Level 3'
A 01-07-2019 'Level 4'
B 01-01-2019 'Level 1'
B 01-03-2019 'Level 2'
B 01-09-2019 'Level 3'")