使用循环定义数据片段(for和if)

时间:2013-03-07 14:05:47

标签: r

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

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)
}

我忘了开始和结束都是我改变变量名称时的功能...... 谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

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