R:如何计算1的数量并写入向量

Han*_*ans 2 r

我有信号矢量,看起来像这样:

a < - c(1,1,1,1,1,0,0,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,0 ,0,0,0,0,0,0,0,0,0,1,1,1)

我将计算1在一个raw中出现的频率,并将其写入向量b,例如对于向量a,它应该导致:

b
5,2,1,1,1,1,3

原因是我将绘制一个直方图,显示事件长度的分布.也许在R中已经有一个功能正是如此?否则使用if-loop?

干杯格雷格

akr*_*run 5

您可以尝试rle(请注意,这些解决方案也来自base R)

with(rle(a), lengths[!!values])
#[1] 5 2 1 1 1 1 3
Run Code Online (Sandbox Code Playgroud)

要么

unname(table(cumsum(c(1,abs(diff(a)))))[c(TRUE, FALSE)])
#[1] 5 2 1 1 1 1 3
Run Code Online (Sandbox Code Playgroud)

如果向量不是二进制

with(rle(a), lengths[values==1])
#[1] 5 2 1 1 1 1 3
Run Code Online (Sandbox Code Playgroud)

要么

unname(table(cumsum(c(1,abs(diff(a==1)))))[c(TRUE, FALSE)])
Run Code Online (Sandbox Code Playgroud)

编辑

如果向量以除以外的数字开头1.例如02(如评论中@Ananda Mahto所述)

 a[1] <- 2
 a1 <- a[which(a==1)[1]:length(a)]
 unname(table(cumsum(c(1,abs(diff(a1==1)))))[c(TRUE, FALSE)])
 #[1] 4 2 1 1 1 1 3
 with(rle(a), lengths[values==1])
 #[1] 4 2 1 1 1 1 3
Run Code Online (Sandbox Code Playgroud)

要么

with(rle(a == 1), lengths[values]) # from @Richard Scriven's comments
Run Code Online (Sandbox Code Playgroud)