我有大量的数据,但这只是一个代表性的例子。
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)
}
我忘了开始和结束都是我改变变量名称时的功能...... 谢谢
答案 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
请注意,我没有对此进行过广泛的测试...