根据日期和初始事件识别重复ID的后续事件

时间:2019-04-02 19:57:09

标签: r duplicates

我正在尝试根据日期和初始事件确定重复ID。以下是样本数据集


+----+------------+-------------------------+
| ID |    Date    | Investigation or Intake |
+----+------------+-------------------------+
|  1 | 1/1/2019   | Investigation           |
|  2 | 1/2/2019   | Investigation           |
|  3 | 1/3/2019   | Investigation           |
|  4 | 1/4/2019   | Investigation           |
|  1 | 1/2/2019   | Intake                  |
|  2 | 12/31/2018 | Intake                  |
| 3  | 1/5/2019   | Intake                  |
+----+------------+-------------------------+

我想编写R代码以通过1到4的ID(具有调查的ID),并查看它们是否有后续摄入量(摄入发生在比调查日期晚的日期)。因此,预期的输出如下所示:


+----+------------+-------------------------+------------+
| ID |    Date    | Investigation or Intake | New Column |
+----+------------+-------------------------+------------+
|  1 | 1/1/2019   | Investigation           | Sub Intake |
|  2 | 1/2/2019   | Investigation           | None       |
|  3 | 1/3/2019   | Investigation           | Sub Intake |
|  4 | 1/4/2019   | Investigation           | None       |
|  1 | 1/2/2019   | Intake                  |            |
|  2 | 12/31/2018 | Intake                  |            |
| 3  | 1/5/2019   | Intake                  |            |
+----+------------+-------------------------+------------+

代码将如何解决此问题?我猜这将是一些循环功能吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用dplyr包并使用某些ifelse语句来执行此操作,以根据需要创建新列。 除了使用循环之外,还可以使用lead函数检查组中的下一个条目。 此解决方案假定在每个组中都有一个“调查”,然后有0个或多个“摄入”条目,随后列出。

library(dplyr)
df <- data.frame(ID = c(1, 2, 3, 4, 1, 2, 3),
                   Date = as.Date(c("2019-01-01", "2019-01-02", "2019-1-03", "2019-01-04", "2019-01-02", "2018-12-31", "2019-1-5")),
                   Investigation_or_Intake = c("Investigation", "Investigation", "Investigation", "Investigation", "Intake", "Intake", "Intake"),
                   stringsAsFactors = FALSE)
 df %>% 
   group_by(ID) %>% # Make groups according to ID column
   mutate(newcol = ifelse(lead(Date) > Date, "Sub Intake", "None"), # Check next entry in the group to see if Date is after current
          newcol = ifelse(Investigation_or_Intake == "Investigation" & is.na(newcol), "None", newcol)) # Change "Investigation" entries with no Intake to "None" 

这给

ID Date       Investigation_or_Intake newcol    
  <dbl> <date>     <chr>                   <chr>     
1     1 2019-01-01 Investigation           Sub Intake
2     2 2019-01-02 Investigation           None      
3     3 2019-01-03 Investigation           Sub Intake
4     4 2019-01-04 Investigation           None      
5     1 2019-01-02 Intake                  NA        
6     2 2018-12-31 Intake                  NA        
7     3 2019-01-05 Intake                  NA