2013-01-10 34 views
0

我試圖清理數據集(以下子樣本)中的R是一個特定的時間內觀察獨特的框架

據我可以告訴解釋的最好方式,如果通過IF函數:

如果天線= 1,在此時間戳之前的5分鐘內是否有另一個觀測?如果是這樣給真/假

但是我不確定如何去這

   Date.Time Aerial 
794 2012-10-01 08:18:00  1 
795 2012-10-01 08:34:00  1 
796 2012-10-01 08:39:00  1 
797 2012-10-01 08:42:00  1 
798 2012-10-01 08:48:00  1 
799 2012-10-01 08:54:00  1 
800 2012-10-01 08:58:00  1 
801 2012-10-01 09:04:00  1 
802 2012-10-01 09:05:00  1 
803 2012-10-01 09:11:00  1 
1576 2012-10-01 09:17:00  2 
1577 2012-10-01 09:18:00  2 
804 2012-10-01 09:19:00  1 
805 2012-10-01 09:20:00  1 
1580 2012-10-01 09:21:00  2 
1581 2012-10-01 09:23:00  2 
806 2012-10-01 09:25:00  1 
807 2012-10-01 09:32:00  1 
808 2012-10-01 09:37:00  1 
809 2012-10-01 09:43:00  1 

例如在09:19天線= 1分之前的5分鐘內,在09:18和09:17有一個觀測值,因此我想在09:19取消觀測。這是大數據集,因此它可能發生多次

道歉,如果這是不是要問的比較新的R.

我的想法正確的方法:

使用if.else聲明,但我不能獲取日期時間與此一起工作。

不要有代碼已經在圈子裏試圖做它一直兜兜問這個上面

+1

'rollapply'在'zoo'包? http://hosho.ees.hokudai.ac.jp/~kubo/Rdoc/library/zoo/html/rollapply.html –

回答

0
d<-read.table(text='Date.Time Aerial 
794 "2012-10-01 08:18:00"  1 
795 "2012-10-01 08:34:00"  1 
796 "2012-10-01 08:39:00"  1 
797 "2012-10-01 08:42:00"  1 
798 "2012-10-01 08:48:00"  1 
799 "2012-10-01 08:54:00"  1 
800 "2012-10-01 08:58:00"  1 
801 "2012-10-01 09:04:00"  1 
802 "2012-10-01 09:05:00"  1 
803 "2012-10-01 09:11:00"  1 
1576 "2012-10-01 09:17:00"  2 
1577 "2012-10-01 09:18:00"  2 
804 "2012-10-01 09:19:00"  1 
805 "2012-10-01 09:20:00"  1 
1580 "2012-10-01 09:21:00"  2 
1581 "2012-10-01 09:23:00"  2 
806 "2012-10-01 09:25:00"  1 
807 "2012-10-01 09:32:00"  1 
808 "2012-10-01 09:37:00"  1 
809 "2012-10-01 09:43:00"  1', header=TRUE, stringsAsFactors=FALSE, row.names=1) 

# convert Date.Time to POSIXct 
d<-within(d, Date.Time<-as.POSIXct(Date.Time)) 


# define row aggregator 
f <- function(accumulation, next.row, min.mins=5) { 
    last.dtime <- tail(accumulation,1)$Date.Time 
    next.dtime <- next.row$Date.Time 
    # don't add next.row if Aerial is 1 and time between last record is less than min.mins 
    if (next.row$Aerial == 1 & (as.numeric(next.dtime - last.dtime, units='mins') < min.mins)) 
     accumulation 
    else 
     rbind(accumulation, next.row) 
} 

# aggregate rows 
Reduce(f, split(d[order(d$Date.Time), ], sequence(nrow(d)))) 

#    Date.Time Aerial 
# 794 2012-10-01 08:18:00  1 
# 795 2012-10-01 08:34:00  1 
# 796 2012-10-01 08:39:00  1 
# 798 2012-10-01 08:48:00  1 
# 799 2012-10-01 08:54:00  1 
# 801 2012-10-01 09:04:00  1 
# 803 2012-10-01 09:11:00  1 
# 1576 2012-10-01 09:17:00  2 
# 1581 2012-10-01 09:23:00  2 
# 807 2012-10-01 09:32:00  1 
# 808 2012-10-01 09:37:00  1 
# 809 2012-10-01 09:43:00  1 
+0

這個作品完美,非常感謝你!我的R知識只能變得更好....希望! –

0

diff會給你的數據的特定列的「跑差」之前。如果您在Date.Time上運行diff(或as.POSIXct(Date.Time),如果它尚未採用該格式),它會告訴您每個連續時間間隔之間的差異。所以看的

diff(DataFrame$Date.Time) #or 
diff(as.POSIXct(DataFrame$Date.Time)) #if the first one doesn't work 

結果如果你確定使用一個包,並打算從base功能,rollapply起來,如@AriBFriedman提到,允許你採取diff了一步和應用功能基礎上滾動值(它是zoo包的一部分)。

0
with(dfrm, Aerial == 1 & c(diff(Date.Time),0) > 5) 
[1] TRUE FALSE FALSE TRUE TRUE FALSE TRUE FALSE TRUE TRUE FALSE 
[12] FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE 

這實際上只處理差異的一個方向,無論如何,您是否希望包括末端的項目是一個懸而未決的問題。如果你想在兩個方向上做,那麼在rev(diff (rev (Date.Time)))上工作的附加邏輯&子句可能可以正確設置。我會承認,我想知道diff.POSIXt正在倒退數分鐘。幫助頁面沒有幫助,測試顯示它在幾分鐘內。

得到向後差異可能與差異向量測試的其他方式轉移的其他方式:

with(dfrm, c(FALSE, abs(diff(Date.Time)) > 5)) 
+0

'diff'返回的'difftime'的單位是最小的合理值。如果某些時間步長不到一分鐘,則會以秒爲單位。你需要'as.numeric(diff(Date.Time),units ='mins')'來完全確定你的比較是你想要的。 –

+0

這種方式似乎太折騰了。 OP應該更清楚地說明他希望如何在5分鐘之內處理連續的記錄,但我猜測OP不會在09:11:00和09:25:00之間折騰所有東西。 –

+0

@MatthewPlourde回覆:點#1謝謝。 Re#2:在這種情況下,提出的問題似乎相當清楚,我認爲他要求提供邏輯向量,而不是在此階段刪除案件。 –

相關問題