2014-02-26 26 views
1

我想在某些固定時間事件(事件數= 108)中發生這些時間差時,爲14個不同用戶總結一列時間差異差異列。
這裏與時間的差異「diff`所述第一數據幀的頭部,該數據幀包含152171行:如何在ddply中使用函數循環

head(hope) 
       times  users signal mode diff 
1 2014-01-13 00:00:16 00250902DC7D true ON 31 
2 2014-01-13 00:00:47 00250902DC7D true ON 31 
3 2014-01-13 00:01:18 00250902DC7D true ON 30 
4 2014-01-13 00:01:48 00250902DC7D true ON 31 
5 2014-01-13 00:02:19 00250902DC7D true ON 31 
6 2014-01-13 00:02:50 00250902DC7D true ON 31 

與108個不同的時間範圍(nrow = 108)的第二數據幀是:

head(events) 
      start     end 
1 2014-01-14 06:30:00 2014-01-14 07:00:00 
2 2014-01-14 10:30:00 2014-01-14 11:00:00 
3 2014-01-14 18:00:00 2014-01-14 18:30:00 
4 2014-01-14 22:30:00 2014-01-14 22:59:00 
5 2014-01-15 02:30:00 2014-01-15 02:59:00 
6 2014-01-15 09:00:00 2014-01-15 09:30:00 

如果我手動選擇一個事件(我偶然選擇了第12個事件..),我可以在第12個事件中計算時間差異(diff),它可以工作...但我有108個不同的平均值...

hope1 <- hope[hope$mode=="ON" & hope$times>events[12,1] & hope$times<events[12,2],] 
ddply(hope1,.(users),summarize,sum=sum(diff)) 
     users sum 
1 00250902DC7D 1857 
2 00250902FA92 1857 
3 00250902FB05 1857 
4 002509030C41 1857 
5 002509030E53 1857 

* OK完美,但只針對一個事件 *

如果我想這樣做的108個不同的事件,我應該使用一個循環可能?

我試過類似下面的代碼,但I /失敗...:

> for (i in 1:108) 
+ hope5 <- data.frame(hope[hope$mode=="ON" & hope$times>events[i,1] & hope$times<events[i,2],]) 
ddply(hope5,.(users),summarize,sum=sum(diff)) 

你能幫助我嗎?

我想獲得像這樣的輸出:

> pippo 

        00250902DC7D 00250902FA92 00250902FB05 
2014-01-14 06:30:00   35   32   335 
2014-01-14 10:30:00   38   31   338 
2014-01-14 18:00:00   49   29   429 
2014-01-14 22:30:00   48   438   48 
2014-01-15 02:30:00   29   29   289 

回答

1

您可以用listlapply工作:

hopeN <- lapply(1:nrow(events), function(i) hope[hope$mode=="ON" & hope$times>events[i,1] & hope$times<events[i,2],]) 

result <- lapply(1:length(hopeN), function(i) ddply(hopeN[[i]],.(users),summarize,sum=sum(diff))) 

結果是data.frames列表。

+0

我真的很感謝你,我真的被卡住了:-) – antonio

+0

不客氣! ☺ – Victorp

+0

@Vicorp嗨,我想知道是否有可能獲得不同的數據輸出?我的意思是:'>結果' ** 00250902DC7D 00250902FA92 00250902FB05 ** ** 2014-01-14 06:30:00 ** 35 32 335 ** 2014-01-14 10:30:00 * * 38 31 338 ** 2014-01-14 18:00:00 ** 49 29 429 ** 2014-01-14 22:30:00 ** 48 438 48 ** 2014-01-15 02: 30:00 ** 29 29 289 – antonio