我有以下数据集
日期 | 身份证 | 等级 | 上一个年级 | 新等级 |
---|---|---|---|---|
2005-05-08 | 0034 | 30 | 29 | 30 |
2006-10-23 | 0034 | 31 | 30 | 31 |
2006-09-10 | 0034 | 31 | 31 | 31 |
2020-12-08 | 0034 | 32 | 31 | 32 |
2003-01-22 | 0023 | 25 | 25 | 25 |
2023-01-18 | 0023 | F0 | 25 | F0 |
2009-09-08 | 0011 | 24 | 23 | 24 |
2012-04-09 | 0011 | 24 | 24 | 24 |
2023-05-04 | 0011 | 25 | 24 | 25 |
如您所见,等级与新等级基本相同。
我希望能够通过 ID 捕获成绩从之前的成绩更改为另一个成绩的日期。例如,当 ID 0034 的成绩从 30 更改为 31 以及从 31 更改为 32 时,我想捕获一列并将其称为“成绩输入日期”。 ID 0023 也是如此,依此类推。此外,我想要另一列来捕获最新的成绩更改日期(成绩上次更改)
日期 | 身份证 | 等级 | 入学日期 | 上次更改成绩 |
---|---|---|---|---|
2005-05-08 | 0034 | 30 | 2005-05-08 | 不适用 |
2006-10-23 | 0034 | 31 | 2006-10-23 | 不适用 |
2006-09-10 | 0034 | 31 | 不适用 | 不适用 |
2020-12-08 | 0034 | 32 | 2020-12-08 | 2020-12-08 |
2003-01-18 | 0023 | 25 | 不适用 | 不适用 |
2023-01-18 | 0023 | D0 | 2023-01-18 | 2023-01-18 |
2012-04-09 | 0011 | 24 | 不适用 | 不适用 |
2023-05-04 | 0011 | 25 | 2023-05-04 | 2023-05-04 |
只需确保您的数据按 ID 和日期排序,然后按 ID 和成绩分组即可。您可以使用
first(Date)
创建首次输入日期的列。从逻辑上讲,“成绩上次更改”的日期必须与成绩输入日期相同,因此保留它似乎毫无意义,但我想如果您确实需要它,您可以将其复制过来。请注意,您的列中不应有 NA 值,因为始终可以指定任何给定行的成绩输入日期:
library(tidyverse)
df %>%
arrange(ID, Date) %>%
group_by(ID, Grade) %>%
mutate(`Grade Entry Date` = first(Date)) %>%
mutate(`Grade Last Change` = `Grade Entry Date`) %>%
select(-`Grade Previous`, -`Grade New`)%>%
as.data.frame()
#> Date ID Grade Grade Entry Date Grade Last Change
#> 1 2009-09-07 0011 24 2009-09-07 2009-09-07
#> 2 2012-04-08 0011 24 2009-09-07 2009-09-07
#> 3 2023-05-03 0011 25 2023-05-03 2023-05-03
#> 4 2003-01-22 0023 25 2003-01-22 2003-01-22
#> 5 2023-01-18 0023 F0 2023-01-18 2023-01-18
#> 6 2005-05-07 0034 30 2005-05-07 2005-05-07
#> 7 2006-09-09 0034 31 2006-09-09 2006-09-09
#> 8 2006-10-22 0034 31 2006-09-09 2006-09-09
#> 9 2020-12-08 0034 32 2020-12-08 2020-12-08