2017-09-20 32 views
0

我有一個增加的年份值列表,偶爾會有中斷值,我想爲每個不間斷序列創建一個分組值。覺得像這樣的(缺少2005,2011)的載體:R:生成索引值來增加組中向量的值

x <- c(2001,2002,2003,2004,2006,2007,2008,2009,2010,2013,2014,2015,2016) 

我想產生一個等長向量數量與同一指數運行的每一個值與像這樣結束了。

[1] 1 1 1 1 2 2 2 2 2 3 3 3 3 

我想做到這一點使用最佳R的做法,所以我儘量避免回落到一個for循環,但我不知道如何從向量A到B.矢量有沒有人有什麼建議?

有些事情,我知道我可以做:

  • 我可以前後標誌備案與ifelse作爲真正的差距
  • 我可以當計數器應該通過包裹這種變化的指數在該聲明中

這是代碼做每個

ifelse(!is.na(lag(x)) & x == lag(x)+1, FALSE, TRUE) 

which(ifelse(!is.na(lag(x)) & x == lag(x)+1, FALSE, TRUE)) 
+0

'cummax(c(1,diff(x)))' –

+1

呵呵,我從來沒有想過用cummax做跑步計數器。這真的很好。 – RandomString

回答

0

我認爲這個問題有幾個解決方案。一個作爲d.b發佈在上面的註釋中,將產生一個序列,每當序列中斷時就會增加。

cummax(c(1, diff(x))) 

有一個類似的解決方案,我選擇使用ifelse()標記break和cumsum()。我選擇了這種解決方案,因爲其他信息(如其他向量)可以包含在決策中,差異似乎存在非常不穩定的向上和向下值問題。

cumsum(ifelse(!is.na(lag(x)) & x == lag(x) + 1, FALSE, TRUE))