R语言 计算抛硬币序列中的交替次数

ukdjmx9f  于 2023-01-18  发布在  其他
关注(0)|答案(4)|浏览(121)

我有一个1和0的序列,我想计算交替的数量,例如:

x <- rbinom(10, 1, 1/2)
> x
 [1] 0 0 1 1 1 1 1 0 1 0

因此,我想计算(在R中)序列从1到0交替(或翻转)的次数。在上面的序列中,交替的次数(手工计算)是4。

nfeuvbwi

nfeuvbwi1#

您可以使用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
s4n0splo

s4n0splo2#

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()方法更快或更慢,但如果需要的话,它也会提供运行长度...

kqlmhetl

kqlmhetl3#

在优雅方面,它绝对没有击败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

看起来应该有一个很好的解析解来表示序列中不相等的相邻元素的个数的分布。

cczfrluj

cczfrluj4#

伪代码(序列是一个包含硬币翻转的数组):

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++

计数应该是你的结果

相关问题