根据成绩值的变化查找成绩入学日期

问题描述 投票:0回答:1

我有以下数据集

日期 身份证 等级 上一个年级 新等级
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
r if-statement subset
1个回答
0
投票

只需确保您的数据按 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
© www.soinside.com 2019 - 2024. All rights reserved.