基于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))
答案 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"