我有一个包含许多行的数据框,但结构如下所示:
year factor
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 1
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 1
18 0
19 0
20 0
我需要添加一个计数器作为第三列。它应该计算包含零的累积单元格,直到遇到值1时再次设置为零。结果应如下所示:
year factor count
1 0 0
2 0 1
3 0 2
4 0 3
5 0 4
6 0 5
7 0 6
8 0 7
9 1 0
10 0 1
11 0 2
12 0 3
13 0 4
14 0 5
15 0 6
16 0 7
17 1 0
18 0 1
19 0 2
20 0 3
我很乐意快速完成,避免循环,因为我必须对数百个文件进行操作。
您可以复制我的数据框,在"..."
这里粘贴数据框:
dt <- read.table( text="...", , header = TRUE )
答案 0 :(得分:2)
使用ave
这样的解决方案也许适合您:
A <- cumsum(dt$factor)
ave(A, A, FUN = seq_along) - 1
# [1] 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3
(错过了第一个值应为“0”。糟糕。)
x <- rle(dt$factor == 1)
y <- sequence(x$lengths)
y[dt$factor == 1] <- 0
y
# [1] 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 0 1 2 3