1

我有大量的数据,但这只是一个有代表性的例子。

data=c(0,0,0,0,0.1,0.1,0.1,0,0,0,0,0.2,0.1,0,0,0.3,0.1,0.1,0,0)

我正在尝试定义单独的事件,这些事件以不同于零的第一个值开始,并以不等于零的最后一个值结束(事件不得包含零值)。所以在这种情况下,我将有三个事件:(0.1,0.1,0.1)、(0.2,0.1) 和 (0.3,0.1,0.1)。首先,我尝试定义第一个不为零的数字:

events <- list()
for(i in seq(1,length(data),1)){
if(data[i]==0) next
else start1=i

当循环找到与零不同的第一个值时,我尝试使用另一个 for 循环(并重复)来定义事件的结束,但我的解决方案都不起作用......

然后我尝试用部分数据定义新列表:

events[[paste('ev', end1-start1)]] = data[start1:end1]
rm(start1); rm(end1)
}

当我更改变量的名称时,我忘记了 start 和 end 是函数...谢谢

4

2 回答 2

4

也使用rle,但获得结果的方式不同:

rr  <- rle(data != 0)
idx <- rr$lengths[rr$values]
split(data[data != 0], rep(seq(idx), idx))

# $`1`
# [1] 0.1 0.1 0.1

# $`2`
# [1] 0.2 0.1

# $`3`
# [1] 0.3 0.1 0.1
于 2013-03-07T14:23:31.160 回答
3

怎么样:

定义数据

data=c(0,0,0,0,0.1,0.1,0.1,0,0,0,0,0.2,0.1,0,0,0.3,0.1,0.1,0,0)

使用rle(正如 Carl Witthoft 在评论中独立建议的那样)

rr <- rle(data!=0)
cc <- c(0,cumsum(rr$lengths))
v <- rr$values

下一位可以通过循环来完成。mapply有点神奇。如果结果恰好都是相同的长度,您可能需要添加SIMPLIFY=FALSE以防止结果折叠到矩阵中。

mapply(function(start,end) data[start:end],
   cc[v]+1,cc[v]+rr$length[v])

## [[1]]
## [1] 0.1 0.1 0.1

## [[2]]
## [1] 0.2 0.1

## [[3]]
## [1] 0.3 0.1 0.1

请注意,我还没有对此进行过广泛的测试...

于 2013-03-07T14:15:08.480 回答