2016-11-17 64 views
0

我曾經使用過一個非常方便的r函數,該函數可以返回一個向量,該向量的值在另一個變量的每次更改時遞增。 這裏將是我的輸入data.frame,用下面的代碼生成:確定向量中值的更改

set.seed(0) data.frame(Day=seq(as.Date("2016-10-01"),as.Date("2016-10-10"),by="day"), bit=sample(c(0,1),size=10,replace=TRUE))

Day   bit 
2016-10-01 1 
2016-10-02 0 
2016-10-03 0 
2016-10-04 1 
2016-10-05 1 
2016-10-06 0 
2016-10-07 1 
2016-10-08 1 
2016-10-09 1 
2016-10-10 1 

我將需要額外的列bit.change

Day   bit bit.change 
2016-10-01 1 1 
2016-10-02 0 2 
2016-10-03 0 2 
2016-10-04 1 3 
2016-10-05 1 3 
2016-10-06 0 4 
2016-10-07 1 5 
2016-10-08 1 5 
2016-10-09 1 5 
2016-10-10 1 5 

我有比較bit其滯後價值的解決方案但它並不優雅。 有人知道我的功能嗎? 如果可能,它應該與dplyr::mutate()dplyr::group_by()一起使用。如果指定group_by(),則bit.change應從每個新組的1再次開始。 Thx很多爲您的幫助!

+0

查看'data.table'中的'rleid()'就可以得到一個這樣的實現。我敢肯定這是一個重複的問題,但'cumsum(abs(c(1,diff(df $ bit))))'也會在基數R中做到。 – thelatemail

+0

Thx。 'rleid()'是我一直在尋找的東西。 Thx也提供'cumsum()'的替代建議 – Vincent

回答

0
df %>% 
    mutate(bit.change=cumsum(c(1, diff(bit) != 0))) 

      Day bit bit.change 
1 2016-10-01 1   1 
2 2016-10-02 0   2 
3 2016-10-03 0   2 
4 2016-10-04 1   3 
5 2016-10-05 1   3 
6 2016-10-06 0   4 
7 2016-10-07 1   5 
8 2016-10-08 1   5 
9 2016-10-09 1   5 
10 2016-10-10 1   5