R:为流程中的每个ID和步骤选择最早的日期,除非步骤出现乱序

时间:2015-08-11 10:04:05

标签: r dplyr

每个UniqueID的目标是选择每个步骤的数据框中出现的最早日期。这可以通过为每个步骤创建数据框,按UniqueID排序和最旧到最新的日期,然后删除重复的唯一ID来完成。

困难的部分是每个步骤代表必须按顺序发生的过程中的步骤。步骤2永远不会发生在步骤1之前,依此类推,如果记录显示步骤2发生在步骤1之前,则这些记录表明数据中应该忽略的错误。

因此,在下面的示例数据框中,对于" A"的唯一ID,我们会忽略步骤2中最早的两个实例,因为它们发生在第1步的最早发生之前,这是不允许的。然后,我们可以继续获取在允许的顺序中发生的每个步骤的最早实例,以获得所需的结果:

 Step 1 = 9/07/2015  
 Step 2 = 20/07/2015  
 Step 3 = 24/07/2015  

对于" B"的UniqueID,步骤3的最早实例发生在步骤2的最早实例之前,因此必须忽略它。一旦我们忽略了这一点,我们就可以继续获得以下所需的值:

 Step 1 = 1/06/2015  
 Step 2 = 22/06/2015  
 Step 3 = 8/07/2015 

示例数据框:

 UniqueID   Date Step
    A  3/07/2015    2
    A  7/07/2015    2
    A  9/07/2015    1
    A 14/07/2015    1
    A 17/07/2015    1
    A 20/07/2015    2
    A 23/07/2015    2
    A 24/07/2015    3
    A 29/07/2015    3
    B  1/06/2015    1
    B 15/06/2015    1
    B 22/06/2015    1
    B 29/06/2015    1
    B 13/07/2015    3
    B 22/06/2015    2
    B  8/07/2015    3
    B 27/07/2015    3

真实数据集非常大。我们可以使用哪些技术来有效地获得所需的输出。我们想要一个数据框,每个UniqueID都有一行,每个Step的列显示每个ID到达每个Step的日期。

以下是我的示例数据框的输入:

structure(list(UniqueID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", 
"B"), class = "factor"), Date = structure(c(16619, 16623, 16625, 
16630, 16633, 16636, 16639, 16640, 16645, 16587, 16601, 16608, 
16615, 16629, 16608, 16624, 16643), class = "Date"), Step = c(2, 
2, 1, 1, 1, 2, 2, 3, 3, 1, 1, 1, 1, 3, 3, 3, 2)), .Names = c("UniqueID", 
"Date", "Step"), row.names = c(NA, -17L), class = "data.frame")

1 个答案:

答案 0 :(得分:1)

您需要的是一个快速功能,可以检查步骤顺序的正确性。 这是一个建议:

df <- group_by(df,UniqueID) %>%
           mutate(position1=sapply(Step,function(y) if(y==1){0} else{
                                     min(which(Step<y))
                                       }
            ),
            position2=1:length(Step)) %>%
            print
df <- filter(df,position1<=position2) %>%
                       select(-position1,-position2)

首先,它创建了2个额外的列:position1定义了一个小于当前步骤的元素的最小位置。 Position2只是当前组中此步骤位置的别名。显然,如果position1大于position2,则步骤为&#34;不正确&#34 ;:例如,如果step2在step1之前。 过滤后,您将拥有包含所有正确步骤的数据框,而您只需使用Khashaa的方法。