值之间的一串值的计数

Nat*_*Nat 2 r count dplyr

我有一个简单的数据框,它是一组 ID 列和 0 或 1 的值,例如:

data.frame(replicate(10,sample(0:1,1000,rep=TRUE)))

  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1  1  1  0  1  0  0  1  1  1   0
2  0  0  0  1  0  1  0  0  1   0
3  0  1  1  1  1  0  1  1  1   1
4  0  0  0  1  1  1  1  1  1   0
5  1  0  1  0  1  1  0  1  1   0
6  0  1  1  1  1  1  0  1  1   1
Run Code Online (Sandbox Code Playgroud)

我想为每一列编写一个代码或循环,计算 0 的数量,直到遇到另一个 1,然后继续向下列。因此,理想情况下,输出是一个具有相同 ID 列头的新数据框和一个计数列表:

  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1  3  1  2  1  2  1  1  1  NA  2
2  1  2  1  1  NA 1  2  NA NA  2

   
Run Code Online (Sandbox Code Playgroud)

我不确定如何做到这一点,而且行结果可能有不同的长度。如果每一列都必须创建一个新的数据框,那很好。

Gre*_*gor 5

这是一个基本的 R 解决方案。我使用了一个 10 号的例子而不是一个 1000 号的例子,所以我们可以实际看到发生了什么并确保它看起来是正确的。

set.seed(47)
d = data.frame(replicate(10,sample(0:1,10,rep=TRUE)))
d
#    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# 1   0  0  0  0  0  0  1  1  0   0
# 2   0  1  0  1  0  0  0  0  0   0
# 3   1  1  1  0  1  0  0  0  1   0
# 4   0  0  0  0  0  1  1  1  1   1
# 5   1  1  0  1  0  0  1  1  1   0
# 6   0  1  1  1  1  1  1  1  0   1
# 7   1  1  0  0  1  0  0  1  1   0
# 8   0  0  1  0  1  0  1  0  0   0
# 9   0  0  0  1  1  1  0  0  1   1
# 10  1  1  1  0  1  0  1  1  0   0

results = lapply(d, function(x) with(rle(x), lengths[values == 0]))
max_length = max(lengths(results))
results = lapply(results, function(x) {length(x) = max_length; x})
results = do.call(cbind, results)
results
#      X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# [1,]  2  1  2  1  2  3  2  2  2   3
# [2,]  1  1  2  2  2  1  1  2  1   1
# [3,]  1  2  1  2 NA  2  1 NA  1   2
# [4,]  2 NA  1  1 NA  1 NA NA  1   1
Run Code Online (Sandbox Code Playgroud)