我正在和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的一般最佳做法。
由于
答案 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)