我有一系列 1 和 0,我想计算交替的次数。例如
x <- rbinom(10, 1, 1/2)
> x
[1] 0 0 1 1 1 1 1 0 1 0
因此,我想计算(在 R 中)序列从 1 交替(或翻转)到 0 的次数。在上述序列中,交替次数(手动计数)为 4。
我有一系列 1 和 0,我想计算交替的次数。例如
x <- rbinom(10, 1, 1/2)
> x
[1] 0 0 1 1 1 1 1 0 1 0
因此,我想计算(在 R 中)序列从 1 交替(或翻转)到 0 的次数。在上述序列中,交替次数(手动计数)为 4。
您可以使用 diff() :
> x <- rbinom(10,1,1/2)
> x
[1] 0 0 0 1 1 1 1 0 1 0
> sum(diff(x)!=0)
[1] 4
rle 函数将计算向量中相同值的“运行”次数。因此,该向量的长度(减 1)为您提供了更改的数量:
> x
[1] 0 0 0 1 1 1 1 0 1 0
> rle(x)
Run Length Encoding
lengths: int [1:5] 3 4 1 1 1
values : num [1:5] 0 1 0 1 0
> length(rle(x)$lengths)-1
[1] 4
可能比 diff() 方法更快或更慢,但如果您需要它们,它也会为您提供运行长度......
它绝对不会在优雅方面击败 diff ,而是另一种方式:
sum(x[-1] != head(x, n=-1))
在我的系统上,这似乎要快一点:
> x <- rbinom(1e6, 1, 0.5)
> system.time(replicate(100, sum(x[-1] != head(x, n=-1))))
user system elapsed
8.421 3.688 12.150
> system.time(replicate(100, sum(diff(x) != 0)))
user system elapsed
9.431 4.525 14.248
似乎应该有一个很好的分析解决方案来分配序列中不相等的相邻元素的数量。
伪代码(序列是一个包含硬币翻转的数组):
variable count = 0
variable state = sequence[0]
iterate i from sequence[1] to sequence[n]
if (state not equal sequence[i])
state = 1 - state
count++
计数应该是你的结果