2014-10-30 6 views
4

문자열에서 3 개 이상의 연속적인 0을 연속적인 1로 대체하고 싶습니다. 예 : '1001000001'은 '1001111111'이됩니다. R에서반복되는 문자를 다른 반복 된 문자로 바꾸기

, 나는 다음과 같은 코드를 작성 :

gsub("0{3,}","1",reporting_line_string) 

을하지만, 분명히 그것은 하나의 1 씩 5 0 어떻게 5 초 얻을 수를 대체?

감사합니다, (나 같은) regex ignorants를 들어

답변

5

당신은 당신이 일치 내용을 대체 할 대체 기능을 제공 할 수있는 gsubfn 기능을 사용할 수 있습니다 .... 지금 내 마음에 오지 않을 것 정규식. 당신이 stringi 패키지가 설치되어있는 경우

require(gsubfn) 
gsubfn("0{3,}", function (x) paste(replicate(nchar(x), "1"), collapse=""), input) 

당신은 stri_dup("1", nchar(x))paste(replicate(nchar(x), "1"), collapse="")을 대체 할 수 있습니다.

gsub("(?!\\A)\\G0|(?=0{3,})0", "1", input, perl=TRUE) 

그것은이다 : 또는

gsubfn("0{3,}", ~ gsub(".", 1, x), input) 

, 당신은 대체 펄 모드에서 다음 정규식을 사용할 수 있습니다 G. Grothendieck

아니면 더 간결 솔루션

는 코멘트에 제안 0{3,} 부분을 변경하여 임의의 숫자로 연속적으로 확장 가능 0.

개인적으로이 솔루션의 사용을 보증하지는 않지만 유지 관리가 쉽지 않습니다.

+0

또한 시도하십시오 :'gsubfn ("0 {3,}", ~ gsub (".", 1, x), input)' –

1

, 일부 무력을 사용해보십시오. strsplit을 사용하여 문자열을 단일 문자로 분할하고 rle을 사용하여 연속적인 "0"을 찾고 rep을 사용하여 관련 색인 (실행 길이 "0"> 2) 벡터를 만들고 색인에 "1"을 삽입하고 색인에 paste을 삽입합니다. 단일 문자열.

x2 <- strsplit(x = "1001000001", split = "")[[1]] 
r <- rle(x2 == "0") 
idx <- rep(x = r$lengths > 2, times = r$lengths) 
x2[idx] <- "1" 
paste(x2, collapse = "") 
# [1] "1001111111" 
2

여기 당신의 접근 방식을 기반으로하는 옵션이지만 gregexprregmatches를 사용합니다. 이이 작업을 수행 할 수있는 더 DRY 방법은 아마,하지만

x <- c("1001000001", "120000siw22000100") 
x 
# [1] "1001000001"  "120000siw22000100" 
a <- regmatches(x, gregexpr("0{3,}", x)) 
regmatches(x, gregexpr("0{3,}", x)) <- lapply(a, function(x) gsub("0", "1", x)) 
x 
# [1] "1001111111"  "121111siw22111100" 
관련 문제