R 将重复元素的向量折叠/压缩为最大k重复

R 将重复元素的向量折叠/压缩为最大k重复,r,R,有没有一种比下面基于rle的函数更有效的方法来压缩/折叠向量(比如字符串)到max k-repeated。下面给出了示例输入和期望输出 输入 对于k=3,期望输出为: "a" "a" "b" "b" "a" "a" "a" "a" "a" "b" "b" "b" "a" "a" 目前,我正在使用rle实现以下目标: collapseRLE <- function(v, k) { vrle <- rle(v) vrle$lengths[vrle$lengths > k

有没有一种比下面基于
rle
的函数更有效的方法来压缩/折叠向量(比如字符串)到max k-repeated。下面给出了示例输入和期望输出

输入

对于k=3,期望输出为:

"a" "a" "b" "b" "a" "a"
"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))

collapseRLE我们可以使用
data.table中的
rleid
。根据向量上的
rleid
分组,我们从索引中提供“k”序列的子集,并将列提取为向量(
$V1

库(data.table)

f1似乎是一种很好的方式。
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))
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"