如何计算列中的更改

Che*_*ega 2 counter r

我正在寻找一种简单的方法来计算我的数据框的"AA"列中发生的变化; 所以新列"BB"应该在下面给出的df中看起来像:

df <- as.data.frame(cbind("Year"=c(2000,2000,2000,2001,2001,2001,2002,2002,2002,2003), "AA"=c(136,137,137,158,162,21,21,55,55,55), "BB"=c(1,2,2,3,4,5,5,6,6,6)))

换句话说,"AA"中的任何变化(增加或减少)都应该通过加起来在"BB"中计算...

Jus*_*tin 6

我喜欢rle这个:

foo <- rle(df$AA)
foo$values <- 1:length(foo$values)
df$BB <- inverse.rle(foo)
Run Code Online (Sandbox Code Playgroud)


Rol*_*and 6

我喜欢这样使用cumsum:

df$BB <-  cumsum(c(1, head(df$AA, -1) != tail(df$AA, -1)))
Run Code Online (Sandbox Code Playgroud)

基准x <- sample(1:10,1e4,TRUE):

Unit: microseconds
   expr  min   lq median   uq  max neval
 Jus(x) 1259 1330   1936 1987 5289   100
 Rol(x)  391  402    463  616 3903   100
Run Code Online (Sandbox Code Playgroud)