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

R:为流程中的每个ID和步骤选择最早日期,步骤出现无序时除外,r,dplyr,R,Dplyr,目标是为每个UniqueID选择每个步骤在数据框中出现的最早日期。这可以通过为每个步骤创建一个数据框来完成,按UniqueID和日期从最早到最新排序,然后删除重复的UniqueID 困难的是,每一步都代表了一个过程中必须按顺序发生的步骤。步骤2永远不会发生在步骤1之前,依此类推,如果记录显示步骤2发生在步骤1之前,则这些记录表示应忽略数据中的错误 因此,在下面的示例数据框中,对于“A”的唯一ID,我们将忽略步骤2的最早两个实例,因为它们发生在步骤1的最早发生之前,这是不允许的。然后,我们可以继续

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

困难的是,每一步都代表了一个过程中必须按顺序发生的步骤。步骤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有一行,每个步骤有一列,显示每个ID到达每个步骤的日期

以下是我的示例数据帧的dput:

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")

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

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)
df%
如果(y==1){0}其他,则使用mutate(position1=sapply)(步骤,函数(y)){
最小值(哪个步骤%
打印

df
df%>%group_by(UniqueID,Step)%%>%filter(Date==min(Date))%%>%arrange(Step)
假设$df$Date$格式正确。@khasha您显然没有读过这个问题…@DavidArenburg您是对的:)@尽管如此,Khashaa还是很感谢你。这是一种更好的方法,可以用filter获得每个步骤的最早日期。@Khashaa我也这么认为,但如果你有两个连续的无序值,它就不起作用了。因为假设你有2个,然后是4个,然后是3个。所以4-3>=0这是有效的,但只适用于唯一ID为a的观测值。我们如何修改调整函数,使其针对UniqueID的每个实例分别运行,就像它们是一个单独的表一样?第一个group_by语句group_by(df,UniqueID)应该可以这样做,这要感谢这项工作,但只需进行一次修改。我更改了这一行:
min(其中(这也适用于示例数据集,但使用具有2000个UniqueID和5000条记录的真实数据集会崩溃。UniqueID是一个因素。它是否有助于更改数据类型?更可能的是,真实数据集有一些无法通过此函数处理的条目,例如,当一个值为NA或只有on时你能发送一个带有唯一ID的数据的例子吗?