2013-06-20 29 views
1

我都對着plyr但我想實現比普通的拆分數據爲子集和應用功能,每個子集。(不是一般的,很有挑戰性)

Time    Criteria 

17/05/2013 17:22 A 
17/05/2013 17:23 A 
17/05/2013 17:29 A 
17/05/2013 17:22 B 
17/05/2013 17:28 B 
17/05/2013 17:29 B 
25/05/2013 16:56 C 
25/05/2013 16:56 C 

我很大的不同想要按照標準拆分這些數據。然後,對於每個子集,遍歷記錄並決定是否保留該記錄,如果每條記錄距離最後一條記錄少於5分鐘。

所需的結果:

Time    Criteria Keep 

17/05/2013 17:22 A   T 
17/05/2013 17:23 A   T 
17/05/2013 17:29 A   F --> 29 is more than 5 mins from 23 
17/05/2013 17:22 B   F --> Not keeping this because it is >5min from next record 
17/05/2013 17:28 B   T 
17/05/2013 17:29 B   T 
25/05/2013 16:56 C   T 
25/05/2013 16:56 C   T 

Dput:

structure(list(Time = structure(c(1368782520, 1368782580, 1368782940, 
1368782520, 1368782880, 1368782940, 1369472160, 1369472160), class = c("POSIXct", 
"POSIXt"), tzone = "Singapore"), Criteria = structure(c(1L, 1L, 
1L, 2L, 2L, 2L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor")), .Names = c("Time", 
"Criteria"), row.names = c(NA, -8L), class = "data.frame") 
+1

我不確定這是否構成良好。爲什麼它不會是第二個'B'被踢出去的,因爲它遠離第一個'B'超過'5'而不是相反? – flodel

+0

我需要以編程的方式做到這一點,只要面臨上述條件,就放棄第一行並繼續嘗試下一步。這就是17:22被拋棄的原因,17:28,17:29被保留下來。 – laiboonh

+0

我試圖弄清楚爲什麼我的解決方案沒有提供所需的結果,並意識到您的「時間」在您的演示數據和預期結果之間並不一致... – alexwhan

回答

6

這工作:

ddply(dat, "Criteria", transform, 
     Keep = c(FALSE, diff(Time) <= 5) | 
      c(diff(Time) <= 5, FALSE)) 

#     Time Criteria Keep 
# 1 2013-05-17 17:22:00  A TRUE 
# 2 2013-05-17 17:23:00  A TRUE 
# 3 2013-05-17 17:29:00  A FALSE 
# 4 2013-05-17 17:22:00  B FALSE 
# 5 2013-05-17 17:28:00  B TRUE 
# 6 2013-05-17 17:29:00  B TRUE 
# 7 2013-05-25 16:56:00  C TRUE 
# 8 2013-05-25 16:56:00  C TRUE 

我不是超級熟悉DIFF日期,所以你可能要小心,找出是否有辦法讓系統以分鐘爲單位返回時間差(在這個例子中就是這種情況)呃。)

+0

如果這不是太麻煩,你會介意向我解釋這是如何工作的嗎? c(FALSE,diff(時間)<= 5)| c(diff(Time)<= 5,FALSE)將以向量長度2結束,它如何適合1個變量「Keep」? – laiboonh

+0

它寫着:如果我在上一個五分鐘之內或('|')在下一個五分鐘之內,請「保留我」。第一個元素沒有前一個元素,最後一個元素沒有最後一個元素,因此使用'c(FALSE,...)'和'c(...,FALSE)'。 – flodel

+0

優秀的解決方案 – alexwhan

相關問題