折叠/压缩重复元素的向量到最大k重复

时间:2017-01-24 16:29:04

标签: r

基于rle,有一种比下面的函数更有效的方法来压缩/折叠一个矢量,让我们说字符串,进入最大k重复。下面给出的输入和期望输出示例,。

输入

foov <- rep(c("a", "b", "a"), c(5, 3, 2))

对于k = 2,期望的输出将是:

"a" "a" "b" "b" "a" "a"

对于k = 3,期望的输出将是:

"a" "a" "a" "b" "b" "b" "a" "a"

目前我正在使用rle,如下所示:

collapseRLE <- function(v, k) {
  vrle <- rle(v)
  vrle$lengths[vrle$lengths > k] <- k
  ret <- rep(vrle$values, vrle$lengths)
  return(invisible(ret))
}
foov <- rep(c("a", "b", "a"), c(5, 3, 2))
print(collapseRLE(foov, 2))

1 个答案:

答案 0 :(得分:2)

我们可以使用rleid中的data.table。基于rleid对向量的分组,我们从索引中提供子集,提供了&#39; k&#39;并将列提取为向量($V1

library(data.table)
f1 <- function(k, vec) data.table(vec)[, vec[seq_len(pmin(k, .N))], rleid(vec)]$V1
f1(2, foov)
#[1] "a" "a" "b" "b" "a" "a"
f1(3, foov)
#[1] "a" "a" "a" "b" "b" "b" "a" "a"