我的数据由一长串0组成,中间有一些1。我需要做的是以下列格式之一计算每个突发的长度。
答案 0 :(得分:0)
这不使用任何包。 g
与输入s
的长度相同,但是对于第一组中的每一个都是1,对于第二组中的每一个都是2,依此类推。请注意,我们使用的事实是,一系列的总和是它的长度,一组零的总和是零。
g <- cumsum(c(TRUE, diff(s) != 0)) # group labels
out <- ave(s, g, FUN = function(x) replace(0*x, length(x), sum(x)))
,并提供:
> out
[1] 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0
> identical(out, expected)
[1] TRUE
替代方法是相同的,只是我们在代码中使用了length(s)
的一个位置。
alt <- ave(s, g, FUN = function(x) replace(0*x, 1, sum(x)))
构建g
的另一种方法是等效的,可以用来代替g
aboave的代码:
g <- with(rle(s), rep(seq_along(values), lengths))
注意:可重复形式的输入s
和预期输出expected
为:
s <- c(0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0)
expected <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0)
答案 1 :(得分:0)
我们可以使用rleid
中的data.table
来获取单行输出。
library(data.table)
ave(v1, rleid(v1), FUN = function(x) c(length(x), rep(0, length(x)-1)))*v1
#[1] 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0
v1 <- c( 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0 ,0 ,0, 0, 0, 0, 1, 1, 1 ,1, 1, 1, 0, 0, 0)