我有一个1和0的序列,我想计算交替的数量,例如:
x <- rbinom(10, 1, 1/2) > x [1] 0 0 1 1 1 1 1 0 1 0
因此,我想计算(在R中)序列从1到0交替(或翻转)的次数。在上面的序列中,交替的次数(手工计算)是4。
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
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()方法更快或更慢,但如果需要的话,它也会提供运行长度...
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
看起来应该有一个很好的解析解来表示序列中不相等的相邻元素的个数的分布。
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++
计数应该是你的结果
4条答案
按热度按时间nfeuvbwi1#
您可以使用diff():
s4n0splo2#
rle函数将计算一个向量中相同值的“游程”数,因此这个向量的长度(减1)将为你提供改变的次数:
可能比diff()方法更快或更慢,但如果需要的话,它也会提供运行长度...
kqlmhetl3#
在优雅方面,它绝对没有击败diff,但在另一个方面:
在我的系统上,这似乎要快一点:
看起来应该有一个很好的解析解来表示序列中不相等的相邻元素的个数的分布。
cczfrluj4#
伪代码(序列是一个包含硬币翻转的数组):
计数应该是你的结果