2017-01-24 1 views
3

rle에 기반한 함수보다 벡터를 압축/축소하는 데보다 효율적인 방법이 있습니까? 문자열을 최대 k 반복으로 말합니다. 아래에 주어진 예제 입력과 원하는 출력.최대 반복 반복 요소의 벡터 축소/압축

입력 k에 대한

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

은 = 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

이 그 일을 꽤 좋은 방법을 보인다 열을 추출합니다. – nicola

답변

2

rleid부터 data.table까지 사용할 수 있습니다. 인덱스가 'K'의 순서를 제공에서 벡터에 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"