0

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

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

我试过的

我计算了一个服务使用指数来表示第 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
4

1 回答 1

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
于 2012-06-29T09:51:02.827 回答