2013-07-12 4 views
4

두 번째 결과 문자열에 해당 문자를 유지하면서 특정 문자로 문자열을 분할하고자합니다. 거의 모든 원하는 작업을 수행 할 수 있습니다. 단, 내가 지정하는 문자는 strsplit으로 지정됩니다. 단락이라고도합니다.문자 손실없이 분할 된 문자열

strsplit에 구분 기호를 유지하도록 요청하는 방법이 있습니까? 또는 정규 표현식을 사용해야합니까? 조언 해 주셔서 감사합니다. 이것은 아주 기본적인 질문처럼 보입니다. 죄송합니다 중복 있다면. 나는 예를 들어 내가 지금까지 무엇을 보여주고 여기에 기본 R.

를 사용하는 것을 선호 :

my.table <- read.table(text = ' 
                  model npar  AICc 
AA(~region+state+county+city)BB(~region+state+county+city)CC(~1) 17 11111.11 
     AA(~region+state+county)BB(~region+state+county)CC(~123) 14 22222.22 
         AA(~region+state)BB(~region+state)CC(~33) 13 33333.33 
            AA(~region)BB(~region)CC(~4321) 6 44444.44 
', header = TRUE, stringsAsFactors = FALSE) 

desired.result <- read.table(text = ' 
                 model  CC npar  AICc 
AA(~region+state+county+city)BB(~region+state+county+city) CC(~1) 17 11111.11 
      AA(~region+state+county)BB(~region+state+county) CC(~123) 14 22222.22 
         AA(~region+state)BB(~region+state) CC(~33) 13 33333.33 
            AA(~region)BB(~region) CC(~4321) 6 44444.44 
', header = TRUE, stringsAsFactors = FALSE) 

split.model <- strsplit(my.table$model, 'CC\\(') 

split.models <- matrix(unlist(split.model), ncol=2, byrow=TRUE, dimnames = list(NULL, c("model", "CC"))) 

desires.result2 <- data.frame(split.models, my.table[,2:ncol(my.table)]) 
desires.result2 

#              model  CC npar  AICc 
# 1 AA(~region+state+county+city)BB(~region+state+county+city) ~1) 17 11111.11 
# 2   AA(~region+state+county)BB(~region+state+county) ~123) 14 22222.22 
# 3       AA(~region+state)BB(~region+state) ~33) 13 33333.33 
# 4          AA(~region)BB(~region) ~4321) 6 44444.44 

답변

9

기본 개념은 원하는 결과를 얻을 수 strsplit에 정규 표현식에서 look-around 작업을 사용하는 것입니다. 그러나, strsplit과 긍정적 인 선견자로 그것보다 약간 까다 롭습니다. 설명을 위해 @ JoshO'Brien의 this excellent post을 읽으십시오.

pattern <- "(?<=\\))(?=CC)" 
strsplit(my.table$model, pattern, perl=TRUE) 
# [[1]] 
# [1] "AA(~region+state+county+city)BB(~region+state+county+city)" 
# [2] "CC(~1)"              

# [[2]] 
# [1] "AA(~region+state+county)BB(~region+state+county)" 
# [2] "CC(~123)"           

# [[3]] 
# [1] "AA(~region+state)BB(~region+state)" "CC(~33)"       

# [[4]] 
# [1] "AA(~region)BB(~region)" "CC(~4321)"    

은 물론, 내가 당신에게 최종 desired.output를 얻을 수 do.call(rbind, ...)cbind의 작업을 둡니다.

0

게시 한 직후 나는 gsub을 사용하여 공간을 삽입하고 공간을 분할하려고 생각했습니다. , 나는 Arun의 대답을 더 좋아한다.

my.table <- read.table(text = ' 
                  model npar  AICc 
AA(~region+state+county+city)BB(~region+state+county+city)CC(~1) 17 11111.11 
     AA(~region+state+county)BB(~region+state+county)CC(~123) 14 22222.22 
         AA(~region+state)BB(~region+state)CC(~33) 13 33333.33 
            AA(~region)BB(~region)CC(~4321) 6 44444.44 
', header = TRUE, stringsAsFactors = FALSE) 

my.table$model <- gsub("CC", " CC", my.table$model) 

split.model <- strsplit(my.table$model, ' ') 

split.models <- matrix(unlist(split.model), ncol=2, byrow=TRUE, dimnames = list(NULL, c("model", "CC"))) 

desires.result <- data.frame(split.models, my.table[,2:ncol(my.table)]) 
desires.result 

#              model  CC npar  AICc 
# 1 AA(~region+state+county+city)BB(~region+state+county+city) CC(~1) 17 11111.11 
# 2   AA(~region+state+county)BB(~region+state+county) CC(~123) 14 22222.22 
# 3       AA(~region+state)BB(~region+state) CC(~33) 13 33333.33 
# 4          AA(~region)BB(~region) CC(~4321) 6 44444.44 
+3

'sub ('. * (CC. *)', '\\ 1', model)'및'sub ('CC. *' '', 모델)'두 부분을 얻으려면 (두 부분으로 가정) – eddi

0

... 나중에 분리기를 다시 태킹하지 않는 이유는 무엇입니까? regexes를 만지작 거리는 문제를 많이 줄여 줄 것 같습니다.

split.model <- lapply(strsplit(my.table$model, 'CC\\('), function(x) { 
    x[2] <- paste0("CC(", x[2]) 
    x 
}) 
+0

예 : 1)이 방법의 제한은 검색 할 때 (일반적으로이 질문이 아니라 일반적으로) CA , CB, CC, CD 및 CE를 분리하고 문자열을 분할합니다. CF, CG, ... *가 아닌 경우 *. 2) 본질적으로 모든 행에 대해 반복 작업을 수행하고 큰 데이터 (아직 벤치마킹되지 않은)에서 효율적이지 않을 수 있습니다. – Arun

+0

@arun 특정 질문이 제기되면 어떻게 대답합니까? 특정 문자열을 제거하지 않고 어떻게 검색합니까? 그리고 당신이 어리석게도 많은 경우 (수백만?)를 다루지 않는다면 모든 해결책은 기본적으로 순간적입니다. 게다가, 속담처럼, 당신은 실행 시간이 있고 당신은 시간을 쓰고 있습니다. 적절한 정규 표현식을 생각해내는 데 걸리는 시간은 아마도 그것을 실행하는 데 걸리는 시간을 초과 할 것입니다. –

+0

실제로 40k 행의 data.frame에서이 솔루션은 0.8 초가 걸리는 반면 regexp 솔루션은 0.065 초 걸립니다. 이제 0.8 초가 코딩 감각에 많은 시간이 걸리는지 아닌지에 대해 토론 할 수 있습니다. 나는 이미 제한이 "일반적인"시나리오에 있다고 언급 한 것으로 생각됩니다. 그러나 SO에서 관찰 한 경향 (적어도 R 태그 아래)은 가능하면 일반적이고 * 효율적인 * 솔루션을 제공하는 것입니다. 사실, 내 솔루션을 작성하는 데 72 자 정도 소요됩니다. 그래서 당신 *** ***이 의미하는 것은 *** 생각 시간 ***입니다. 나는 다른 생각을했습니다. – Arun