条件满足时休息了吗?

时间:2013-02-06 03:30:54

标签: r cumsum

我想在数据框中的两列上运行累积摘要,如下所示:

    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?

谢谢!

1 个答案:

答案 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