2

我正在寻找一种简单的方法来计算数据框“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”中进行说明......

4

2 回答 2

6

我更cumsum喜欢这样使用:

df$BB <-  cumsum(c(1, head(df$AA, -1) != tail(df$AA, -1)))

基准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
于 2013-07-11T14:27:33.997 回答
6

我喜欢rle这个:

foo <- rle(df$AA)
foo$values <- 1:length(foo$values)
df$BB <- inverse.rle(foo)
于 2013-07-11T14:25:03.083 回答