找出R中序列的平面长度

时间:2015-08-07 10:08:30

标签: r

我正在和R一起玩,并且很难掌握所需的不同编程风格。

我试图做的任务,给出了一系列数字,例如: (1,2,3,3,3,4,5,5,1),在每个点处计算出具有相同值的连续先前点的数量。例如。这个例子的答案是:(0,0,0,1,2,0,0,1,0)。

在更传统的编程语言中,例如Python我会做这样的事情:

flat_count = 0
for i in range(1, len(seq)):
   if seq[i] == seq[i-1]:
       flat_count++
   else:
       flat_count = 0
   seq[i] = flat_count
seq[0] = 0

由于我的印象是应该不惜一切代价避免R中的循环,我对于从哪里开始有点困惑。

到目前为止,我最好的尝试如下:

runs <- rle(seq)
seqs <- sapply(runs$lengths, FUN=seq)

我不确定这是否是一种特别有效的方式,如果是,我不确定如何在seqs中连接我的结果列表。

任何帮助,或者只是R的一般最佳做法。

由于

1 个答案:

答案 0 :(得分:3)

我们可以使用sequence作为unlist(lapply(yourvector, seq_len))的包装器。它通过lapply的值循环(vector),得到序列(seq_len)和unlist

 sequence(runs$lengths)-1
 #[1] 0 0 0 1 2 0 0 1 0

我们从输出中减去1以获得所需的输出。

另一种选择是使用rleid的devel版本中的data.table,即v1.9.5。安装devel版本的说明是here

 library(data.table)#v1.9.5+
 setDT(list(v1))[, seq_along(V1)-1,rleid(V1)]$V1
 #[1] 0 0 0 1 2 0 0 1 0

我们转换了&#39; v1&#39;按rleid(V1)分组的&#39; data.table&#39;,得到&#39; V1&#39;的序列。并从1中减去。

数据

 v1 <- c(1,2,3,3,3,4,5,5,1)
 runs <- rle(v1)