在R

时间:2016-10-11 17:45:22

标签: r

我的数据由一长串0组成,中间有一些1。我需要做的是以下列格式之一计算每个突发的长度。

  • 示例数据:0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0
  • 预期输出:0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 6 0 0 0
  • 替代方案:0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2 个答案:

答案 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)