2016-06-20 20 views
0

我試圖編寫一個函數或使用cut爲這些日期關閉(用戶定義關閉)時的某些日期數據分配一個分組變量。例如,我想爲連續日期收集的一些樣本創建一個通用分組變量。我在想cut會在這裏工作,但後來我意識到cut當它們靠近時不會對變量進行分組,而是基於序列創建一系列組。日期關閉時的組日期變量

所以借這個數據幀,例如:

df <- structure(list(Num = c(0.888401849195361, 0.185766335576773, 
0.493163562379777, 0.13070688676089, 0.484760325402021, 0.603240836178884, 
0.893201333936304, 0.641203448642045, 0.16957180458121, 0.0101411847863346 
), Date = structure(c(10592, 10597, 10598, 10605, 10606, 10608, 
10609, 10616, 10617, 10618), class = "Date"), day = c(1L, 6L, 
7L, 14L, 15L, 17L, 18L, 25L, 26L, 27L)), .Names = c("Num", "Date", 
"day"), row.names = c(NA, -10L), class = "data.frame") 

如果是因爲我瞭解它的用法是這樣來應用切換功能:

df$cutVar <- cut(df$day, breaks= seq(0, 31, by = 1), right=TRUE) 

我將留下與去權的範圍通過我更喜歡分組在一起的價值觀。例如,第6名和第7名應該根據他們彼此的接近程度分組在一起。類似於14日和15日等。

> df 
      Num  Date day cutVar 
1 0.88840185 1999-01-01 1 (0,1] 
2 0.18576634 1999-01-06 6 (5,6] 
3 0.49316356 1999-01-07 7 (6,7] 
4 0.13070689 1999-01-14 14 (13,14] 
5 0.48476033 1999-01-15 15 (14,15] 
6 0.60324084 1999-01-17 17 (16,17] 
7 0.89320133 1999-01-18 18 (17,18] 
8 0.64120345 1999-01-25 25 (24,25] 
9 0.16957180 1999-01-26 26 (25,26] 
10 0.01014118 1999-01-27 27 (26,27] 

因此,這裏的基本問題是如何組連續變量(在此情況下的日期),使得接近(由用戶定義)號中的一個因素範圍組合在一起?

+0

對於_consecutive_日期組,可能'rle'會非常有用。由於傳遞性質,在我看來,「接近」的其他定義將很快變得有問題。 – joran

+0

你可以粘貼一個你想要的輸出的例子嗎(或者是最後的'df')?你只是想要2個相鄰的行結合?例如,如果1與「2」接近,&2接近3,......,19接近20,但1不是遠離「接近」20?數據是否已經存在於一個不變的集合中,或者隨着時間的推移會不斷添加新的數據? – gung

+0

@joran我完全同意這一點。但是,在我的情況下(示例數據可能無法捕獲),這不成問題。這是歷史抽樣數據,有人在一兩天內收集了數據,然後等待了一個月,然後做了同樣的事情。是否有可能概述「rle」的用法? – boshek

回答

1

這是你想要的東西嗎?其中3是我爲了方便而選擇的閾值。它可以是任何你喜歡的數字:

df$group <- cumsum(c(1, diff.Date(df$Date)) >= 3) 
df 
      Num  Date day group 
1 0.88840185 1999-01-01 1  0 
2 0.18576634 1999-01-06 6  1 
3 0.49316356 1999-01-07 7  1 
4 0.13070689 1999-01-14 14  2 
5 0.48476033 1999-01-15 15  2 
6 0.60324084 1999-01-17 17  2 
7 0.89320133 1999-01-18 18  2 
8 0.64120345 1999-01-25 25  3 
9 0.16957180 1999-01-26 26  3 
10 0.01014118 1999-01-27 27  3 
+0

我不完全理解這裏的用法,因爲我無法一般地應用它。例如,如果我添加另一個日期序列('Date2')並根據這些日期創建一個分組('Group2'),這些日期 - 僅分隔一天 - 不會分組在一起:'df $ Date2 < - structure( C(1118620800,1118620800,1118620800,1118707200,1118707200, 1118707200,1118707200,1118707200,1118707200,1118707200),類= C( 「POSIXct」, 「POSIXt」 ),tzone = 「UTC」)' 'DF $ Group2 < - cumsum(c(1,diff.Date(df $ Date2))> = 1)'。有關我如何能夠糾正這種情況的任何想法? – boshek

+0

因爲您選擇的閾值爲'1',這意味着您只能將相同的日期分組。如果您想對具有一天差異的日期進行分組,則將閾值設置爲高於1。同樣,如果在一個組中也考慮到兩天的差異,則將閾值設置爲高於2等。 – Psidom

+0

另一個問題是,在應用diff.Date之前,需要將Date列轉換爲Date類那'diff.Date'將返回Date中的差值而不是秒數。所以'df $ Date2 < - as.Date(df $ Date2)'。 – Psidom