我想在数据框中的两列上运行累积摘要,如下所示:
A B
1 1
1 2
1 3
1 4
1 5
2 6
2 7
2 8
3 9
3 10
让最终的数据框看起来像这样:
A B
1 1
1 2
1 3
1 4
1 5
2 1
2 2
2 3
3 1
3 2
基本上我要问的是如何运行一个cumsum,条件是每次col A改变,重置为1并再次开始运行cumsum?
谢谢!
答案 0 :(得分:3)
R有一个非常有用但命名非常糟糕的函数叫rle
,它代表“运行长度编码”,恰好可以完全按照你想要的那样。
x <- read.table(text=" A B
1 1
1 2
1 3
1 4
1 5
2 6
2 7
2 8
3 9
3 10", header=TRUE)
x_rle <- rle(x$A)
x$new_col <- unlist(sapply(x_rle$lengths, function(x) {return(1:x)}))
结果:
> x
A B new_col
1 1 1 1
2 1 2 2
3 1 3 3
4 1 4 4
5 1 5 5
6 2 6 1
7 2 7 2
8 2 8 3
9 3 9 1
10 3 10 2