2013-03-07 48 views
1

我有大量的数据,但这里只是一个代表性的例子。用循环定义数据段(for和if)

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 

当环路发现不同于零我试图与另一对循环(也重复)来定义事件的结束的第一个值的,但非我的解决方案工作...的

然后我试图与数据的部分定义新的列表:

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

我忘了,开始和结束的功能,当我改变的变量名... 谢谢

+4

开始用'RLE(数据= = 0)'。 'rle'是我最喜欢的功能之一,用于查找这样的条纹。 – 2013-03-07 14:14:22

回答

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(如独立卡尔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 

请注意,我没有测试这个非常广泛...

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

是“== TRUE”多余的?为什么不先定义'rr < - rle(data!= 0)'以避免重新输入和重新计算两次?即'rr < - rle(data!= 0); idx < - rr $长度[rr $ values]' – 2013-03-07 14:24:17

+0

@BenBolker,不知道为什么我先分配它。现在修改。 – Arun 2013-03-07 14:51:29