2013-08-18 13 views
4

我試圖找到一個矢量的過程,可以將以下代碼(這需要一個很長時間運行)之間的計算:查找執行量化方式的for循環與行

for (i in 2:nrow(z)) { 
    if (z$customerID[i]==z$customerID[i-1]) 
    {z$timeDelta[i]<-(z$time[i]-z$time[i-1])} else {z$timeDelta[i]<- NA} 
} 

我試着尋找不同的應用片段,但沒有發現任何有用的東西。

下面是一些樣本數據:

customerID time 
    1   2013-04-17 15:30:00 IDT 
    1   2013-05-19 11:32:00 IDT 
    1   2013-05-20 10:14:00 IDT 
    2   2013-03-14 18:41:00 IST 
    2   2013-04-24 09:52:00 IDT 
    2   2013-04-24 17:08:00 IDT 

而且我想要得到以下的輸出:

customerID time      timeDelta* 
    1   2013-04-17 15:30:00 IDT  NA 
    1   2013-05-19 11:32:00 IDT  31.83 
    1   2013-05-20 10:14:00 IDT  0.94 
    2   2013-03-14 18:41:00 IST  NA 
    2   2013-04-24 09:52:00 IDT  40.59 
    2   2013-04-24 17:08:00 IDT  0.3 

*I prefer the time will be in days 
+0

請提供的樣本數據。 –

+1

爲我們提供示例數據,可重複使用的代碼,可以正確處理數據,並提供所需的輸出(如果還可以顯示**和**向我們解釋所需的輸出,它會很棒)。 – Arun

+1

你可以使用'dput'來提供樣本數據嗎?以這種方式閱讀要容易得多。 –

回答

10
z$timeDelta <- NA 
z$timeDelta[-1] <- ifelse(tail(z$customerID,-1) == head(z$customerID,-1), diff(z$time)/24, NA) 

或較短的版本

z$timeDelta <- NA 
z$timeDelta[-1] <- ifelse(!diff(z$customerID), diff(z$time)/24, NA) 
+0

巧妙的方法+1 –

+0

花了0.1秒在80K數據幀上運行它。 – Guest3290

2

這應該爲你工作:

do.call(rbind,lapply(split(mydf,mydf$customerID), function(df) 
    within(df,timeDelta<-c(NA,diff(time)/24)))) 

結果:

customerID    time timeDelta 
1.1   1 2013-04-17 15:30:00   NA 
1.2   1 2013-05-19 11:32:00 31.8347222 
1.3   1 2013-05-20 10:14:00 0.9458333 
2.4   2 2013-03-14 18:41:00   NA 
2.5   2 2013-04-24 09:52:00 40.5909722 
2.6   2 2013-04-24 17:08:00 0.3027778 
2

這工作:

## z <- read.table(text="customerID time 
##  1   2013-04-17.15:30:00.IDT 
##  1   2013-05-19.11:32:00.IDT 
##  1   2013-05-20.10:14:00.IDT 
##  2   2013-03-14.18:41:00.IST 
##  2   2013-04-24.09:52:00.IDT 
##  2   2013-04-24.17:08:00.IDT", header=TRUE) 
## 
## mydf$time <- z$time <- as.POSIXlt(gsub("\\.", " ", z$time)) 


do.call(rbind, lapply(split(z, z$customerID), function(x) { 
    x$timeDelta <- c(NA, round(as.numeric(diff(x$time), units = "days"), 2)) 
    x 
})) 

##  customerID    time timeDelta 
## 1.1   1 2013-04-17 15:30:00  NA 
## 1.2   1 2013-05-19 11:32:00  31.83 
## 1.3   1 2013-05-20 10:14:00  0.95 
## 2.4   2 2013-03-14 18:41:00  NA 
## 2.5   2 2013-04-24 09:52:00  40.63 
## 2.6   2 2013-04-24 17:08:00  0.30 
1

從包doBy firstobs的一些幫助:

z$timeDelta <- c(NA, diff(z$time)) 
z$timeDelta[firstobs(z$customerID)] <- NA