回顾特定时间窗口内的实例

时间:2012-06-29 09:35:00

标签: r time split apply

我有以下有关服务使用的数据集。允许人们签入和退出服务,因此输入的服务日期和剩余的服务日期。在另一个场合,他们可能会再次进入服务,并在几天后离开。

我希望能够知道一个人对服务的每次使用(由一行代表),他/她在过去一年中使用该服务的次数是多少。

我尝试了什么

我计算了一个服务使用索引来表示服务使用的第n次。接下来,我使用索引来计算自上次服务使用以来的天数。从那以后我就被困住了。我不确定如何回顾。

我很困惑,并会感谢有关如何继续的任何提示。我想使用lapply将每个人分配到自己的数据框中,但之后我该如何回顾?

感谢。

数据集

read.table("http://dl.dropbox.com/u/822467/dataset.csv", sep = ",", header = TRUE)

进一步说明我的需要

以下是来自主题22的数据。该主题总共有5个服务使用。对于每个服务使用没有第一个,我会回顾他进入服务之前的1年。例如。对于服务的第二次使用,我会查看输入日期,即14/08/2009。然后,我会查看之前的服务用法,以查看有多少属于15/08/2008 to 14/08/2009之间的窗口。我需要为每个主题的所有服务使用实例执行此操作。

SubID   Entered_Service Left_Service    Service_Usage_Index Days_Since_Last_Service_Use_Ended
22      09/06/2008      13/06/2008      1                   NA
22      14/08/2009      17/08/2009      2                   427
22      21/03/2010      22/03/2010      3                   216
22      25/03/2010      31/03/2010      4                   3
22      21/06/2010      24/06/2010      5                   82

1 个答案:

答案 0 :(得分:0)

这不是最优雅的解决方案,但我会按照以下步骤(如果我理解你的问题):

data <- read.table("http://dl.dropbox.com/u/822467/dataset.csv", sep = ",", header = TRUE)
# first, define your dates as dates so you can compare them
strptime(data[,2],format="%d/%m/%Y") -> entry
strptime(data[,3],format="%d/%m/%Y") -> exit
strptime("31/12/2011",format="%d/%m/%Y") -> end
strptime("01/01/2011",format="%d/%m/%Y") -> start
# then select all rows from 2011
data[(entry<=end & entry>=start) | (exit<=end & exit>=start),] -> data2011
# then see how many rows correspond to each user ID
summary(as.factor(data2011$SubID))

修改

基于同样的想法,我希望它能做到这一点:

data <- read.table("http://dl.dropbox.com/u/822467/dataset.csv", sep = ",", header = TRUE)
data[!is.na(data[,1]),]->data
result <- rep(NA,length=nrow(data))

for(i in unique(data$SubID)){
# Loop through each subject
    data[data$SubID==i,]->temp
    if(nrow(temp)>1){
        for(j in 2:nrow(temp)){
            strptime(temp[j,2],format="%d/%m/%Y") -> end
            end - 365*24*3600 -> start
            # There might be a better way to substract a year to a date but I don't know it...
            strptime(temp[,2],format="%d/%m/%Y") -> entry
            strptime(temp[,3],format="%d/%m/%Y") -> exit
            nrow(temp[(entry<end & entry>=start) | (exit<end & exit>=start),]) -> result[data$SubID==i & data[,2]==temp[j,2]]
            }
        }
    }

result -> data$result