#title 문자열 찾기와 바꾸기 [[TableOfContents]] R에서는 텍스트를 다루는 다양한 함수들을 제공한다. 보통 한글이나 워드 같은 워드프로세서에서 '편집' 메뉴에 '찾기'와 '바꾸기'에 해당하는 함수들이 있는데 R에도 마찬가지다. '찾기'에 해당하는 함수에는 grep, regexpr, gregexpr이 있고 '바꾸기'에 해당하는 함수에는 sub와 gsub가 있다. ==== 찾기 ==== grep은 문자열 벡터에서 조건에 맞는 문자열의 위치를 찾아준다. 반면 regexpr은 각각의 문자열에서 조건에 맞는 문자열의 위치를 찾는다. 열마디 말보다 한 가지 예제로 확인해보자. {{{ > test <- c('korean', 'english', 'french') > grep('e',test) [1] 1 2 3 > grep('h',test) [1] 2 3 }}} test 벡터에는 'korean', 'english','french' 세 개의 문자열이 들어있다. 첫번째 grep('e',test)는 test 벡터에서 문자 'e'를 포함하는 문자열들을 찾는다. 1,2,3번째 문자열이 모두 포함되어 있으므로 벡터 c(1,2,3)을 돌려준다. 두번째 grep('h',test)는 test 벡터에서 문자 'h'를 포함하는 문자열들을 찾는다. 'korean'에는 'h'가 없으므로 벡터 c(2,3)을 돌려준다. 다음에는 regexpr의 경우를 보자. {{{ > regexpr('e',test) [1] 4 1 3 attr(,"match.length") [1] 1 1 1 > regexpr('h',test) [1] -1 7 6 attr(,"match.length") [1] -1 1 1 }}} regexpr('e',test)는 각각의 문자열에서 'e'가 [b]처음 나타나는 위치[b]를 찾는다. korean에서는 e가 4번째에 있고, english에서는 1번째, french에서는 3번째에 있으므로 4,1,3을 돌려준다. regexpr('h',test)는 마찬가지로 h의 위치를 찾는데 korean에서는 h가 없으므로 -1을 돌려준다. gregexpr은 regexpr과 똑같지만 조건에 맞는 모든 위치를 찾는다. {{{ > gregexpr('n', c('banana','nonnegative') ) [[1]] [1] 3 5 attr(,"match.length") [1] 1 1 [[2]] [1] 1 3 4 attr(,"match.length") [1] 1 1 1 }}} grep, regexpr, gregexpr에서 사용하는 조건은 '정규표현식(regular expression)'이라는 것을 사용한다. 자세한 내용은 ?regex를 입력하여 알아보도록하자. 데이터프레임이나 행렬에서 grep을 이용해 원하는 조건의 행이나 열을 골라낼 수 있다. 예를 들어 컬럼이름이 "la","lc","ma","mc","sa","sc"인 데이터프레임 df가 있다고 하자. {{{ > names(df) [1] "la" "lc" "ma" "mc" "sa" "sc" }}} 만약 m으로 시작하는 컬럼들을 골라내고 싶다면 아래와 같이하면 된다. (^는 정규표현식에서 문자열의 시작을 나타내는 표시이다.) {{{ > df[ grep('^m', names(df)) ] ma mc 1 0.4686332 -2.3181391 2 1.0686862 0.2932005 3 0.4965347 -1.3098333 4 2.4982473 1.8050339 5 1.0137877 0.7284994 6 -0.6003186 0.6879484 }}} 이런 표현은 자주 쓸 수 있으므로 함수로 만들어두면 편리하다. {{{ > select <- function(data, pattern) data[ grep( pattern, names(data)) ] }}} 만약 a로 끝나는 열을 찾고 싶다면 아래와 같이 하면 된다. ( $는 정규표현식에서 문자열의 끝을 나타낸다. ) {{{ > select(df,'a$') la ma sa 1 0.8996971 0.4686332 0.8957182 2 -1.8208916 1.0686862 -1.1269750 3 0.8384951 0.4965347 -0.3537658 4 0.3292016 2.4982473 0.9121382 5 -0.1956051 1.0137877 0.9058837 6 2.0065870 -0.6003186 0.9657682 }}} ==== 바꾸기 ==== sub는 문자열에서 조건에 맞는 첫 부분을 원하는 형태로 바꿔준다. gsub는 첫 부분만이 아니라 모든 부분을 원하는 형태로 바꿔준다. 아래는 e를 !로 바꾸는 예다. {{{ > sub('e', '!', test) [1] "kor!an" "!nglish" "fr!nch" }}} ==== 출처 ==== * http://www.remantu.com/r/tutorial/find-replace-text