2017-01-24 22 views
3

rleに基づいて以下の関数よりも、ベクトルを圧縮/崩壊させるより効率的な方法がありますか?以下の入力例と望ましい出力。 K = 2の場合反復要素のベクトルを最大k回繰り返す

入力

foov <- rep(c("a", "b", "a"), c(5, 3, 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)) 
+3

を「K」のシーケンスを提供し、ベクトルとして列を抽出し、それを行うためのかなり良い方法です。 – nicola

答えて

2

rleidからdata.tableまでを使用できます。ベクター上rleidによってグループ分けに基づいて、我々はインデックスからサブセット($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" 
関連する問題