是否有一个 R 函数可以根据条件计算数据框中先前日期的数量

Posted

技术标签:

【中文标题】是否有一个 R 函数可以根据条件计算数据框中先前日期的数量【英文标题】:Is there an R function that counts the number of previous number of dates in a data frame and based on condition 【发布时间】:2022-01-16 07:22:21 【问题描述】:

我想计算每个学生在最近一次缺勤之前的缺勤次数,并将这些计数作为一列添加到数据框中。

 Student ID       Absent Date       Subject        

    4567           08/30/2018          M
    4567           09/22/2019          M
    8345           09/01/2019          S
    8345           03/30/2019         PE         
    8345           07/18/2017          M
    5601           01/08/2019         SS

这是所需的输出:

 Student ID       Absent Date       Subject       Previous Absence            

    4567           08/30/2018          M                 1
    4567           09/22/2019          M                 1
    8345           09/01/2019          S                 2
    8345           03/30/2019         PE                 2        
    8345           07/18/2017          M                 2
    5601           01/08/2019         SS                 0

然后,我想计算每个学生之前的数学缺勤次数 (M),并将这些计数作为一列添加到数据框中。

 Student ID       Absent Date       Subject       Previous Absence            

    4567           08/30/2018          M                 1
    4567           09/22/2019          M                 1
    8345           09/01/2019          S                 2
    8345           03/30/2019         PE                 2        
    8345           07/18/2017          M                 2
    5601           01/08/2019         SS                 0

想要的输出:

 Student ID  Absent Date  Subject  Prior Absence  Prior M Absence              

    4567      08/30/2018       M           1            1
    4567      09/22/2019       M           1            1
    8345      09/01/2019       S           2            0
    8345      03/30/2019      PE           2            0        
    8345      07/18/2017       M           2            0
    5601      01/08/2019      SS           0            0

谢谢!

【问题讨论】:

您能澄清一下您想要的输出中的“Prior M Absence”吗?对于学生 ID 8345,数学缺勤发生在 2017 年,在其他缺勤之前,但“Prior M Absence”的值为零。那是因为这个值只反映了过去没有的数学课吗?还是打算将 2017 年 7 月 18 日的日期晚于该学生的其他缺勤日期? @Ben 你好! “Prior M Absence”是仅包含以前数学缺勤的列。所以在这种情况下,它是 0,因为学生 8345 只缺席了 1 次数学,这意味着他们以前从未缺席过任何数学。如果学生 8345 的 3 次缺勤中有 2 次是数学,那么“Prior M Absence”输出将为 1。我希望这是有道理的:) 为什么第 2 行中 ID 4567 的前一个不存在 == 1 而不是 2?这不是他第二次缺席吗?? 你好@Onyambu!它是 1,因为之前只有一个缺席。这是关于学生之前缺勤的次数,而不是总缺勤次数。 【参考方案1】:

这假设数据已经按Absent_Date 排序(至少在每个Student_ID 内):

library(dplyr)
df %>%
  group_by(Student_ID) %>%
  mutate(
    n_prior_absence = n() - 1,
    n_prior_absence_math = sum(head(Subject, -1) == "M")
  )
# # A tibble: 6 × 5
# # Groups:   Student_ID [3]
#   Student_ID Absent_Date Subject n_prior_absence n_prior_absence_math
#        <int> <chr>       <chr>             <dbl>                <int>
# 1       4567 08/30/2018  M                     1                    1
# 2       4567 09/22/2019  M                     1                    1
# 3       8345 09/01/2019  S                     2                    0
# 4       8345 03/30/2019  PE                    2                    0
# 5       8345 07/18/2017  M                     2                    0
# 6       5601 01/08/2019  SS                    0                    0

使用这些数据:

df = read.table(text = 'Student_ID       Absent_Date       Subject        
4567           08/30/2018          M
4567           09/22/2019          M
8345           09/01/2019          S
8345           03/30/2019         PE         
8345           07/18/2017          M
5601           01/08/2019         SS', header = T)

【讨论】:

以上是关于是否有一个 R 函数可以根据条件计算数据框中先前日期的数量的主要内容,如果未能解决你的问题,请参考以下文章

如何根据条件选择R数据框中的连续行?

如何编写 R 函数来查找数据框中的特定条件

如何根据与先前日期相关的条件按日期找出不同的人数?

根据条件过滤数据框中的数据

[R]:根据条件行位置将函数应用于列

在python中的数据框中计算与引用可变值的条件相匹配的行