본문 바로가기
R

[R] stringr 패키지 함수

by rubyda 2021. 3. 8.
728x90

데이터를 가공하면서 문자열 데이터를 다룰때가 있습니다. 오늘은 문자열 데이터를 가공하기 위해서 자주 사용되는 stringr 패키지에서 제공하는 함수를 정리해보도록 하겠습니다.


(1) str_length()

문자의 길이를 확인하는 함수입니다.

str_length('안녕하세요 빅공이에요')
[1] 11

(2) str_sub()

원하는 부분을 추출하는 함수입니다. 다음과같이 원하는 문자가 위치한 부분을 start와 end로 인자를 넣어줍니다.

str_sub('안녕하세요 빅공이에요',start=7,end=8)
[1] "빅공"

(3) str_c()

문자열을 합칠때 사용하는 함수입니다.

str_c('안녕하세요 빅공이에요','!')
[1] "안녕하세요 빅공이에요!"

 

(4) str_count()

원하는 문자열이 매칭되는 수를 알려주는 함수입니다.

fruit
[1] "apple"     "banana"    "pear"      "pineapple"

다음과 같은 fruit 데이터가 있다고 가정을 하겠습니다.

str_count(fruit,"a")
[1] 1 3 1 1

문자열 "a"와 매칭되는 수들을 알고싶을때 다음과 같이 입력을 하면 각 원소마다 매칭되는 문자열의 수를 반환해줍니다.

str_count(fruit,c("a","b","p","n"))
[1] 1 1 1 1

다음과 같이 각 원소마다 원하는 문자열을 넣어서 반환할수도 있습니다.

(5) str_detect()

매칭되는 패턴을 TRUE/FALSE 형태로 반환해주는 함수입니다. 정규표현식을 적절하게 활용하면 아주 유용하게 쓰일수 있습니다.

user1
 [1] "dws_1/sub_1.csv"  "dws_11/sub_1.csv" "dws_2/sub_1.csv"  "jog_16/sub_1.csv" "jog_9/sub_1.csv" 
 [6] "sit_13/sub_1.csv" "sit_5/sub_1.csv"  "std_14/sub_1.csv" "std_6/sub_1.csv"  "ups_12/sub_1.csv"
[11] "ups_3/sub_1.csv"  "ups_4/sub_1.csv"  "wlk_15/sub_1.csv" "wlk_7/sub_1.csv"  "wlk_8/sub_1.csv"

다음과 같이 user1 데이터가 있다고 했을때 우리는 wlk문자를 포함하는 단어를 추출하고 싶다고 가정을 해보겠습니다.

str_detect(user1,"wlk")
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE

이렇게 입력하면 다음과 같이 매칭되는 부분은 TRUE, 아닌 부분은 FALSE로 반환을 해줍니다. 여기서 불린 형태가 아닌 진짜 데이터를 추출하고 싶다면 아래와 같이 입력하면 됩니다.

user1[str_detect(user1,"wlk")]
[1] "wlk_15/sub_1.csv" "wlk_7/sub_1.csv"  "wlk_8/sub_1.csv" 

정규표현식 정리
- user1[str_detect(user1,"w")]
: w를 포함하는 모든 원소를 출력
- user1[str_detect(user1,"^w")]: w로 시작하는 원소를 출력
- user1[str_detect(user1,"^[wW]")]: 대소문자 상관없이 w로 시작하는 원소를 출력
- user1[str_detect(user1,"^[aAwW]")]: 대소문자 상관없이 a또는 w로 시작하는 원소를 출력
- user1[str_detect(user1,"^[wW][aA]")]: 대소문자 상관없이 a로 시작하고, 두번째는 a인 원소를 출력 
- user1[str_detect(user1,"w$")]: w로 끝나는 원소를 출력

(6) str_locate()

원하는 특정 문자와 매칭되는 문자열의 시작과 끝 위치 확인을 위해 사용되는 함수입니다.(단, 처음 매칭되는 문자의 위치만 파악할 수 있습니다.)

str_locate("가나가나","가")
     start end
[1,]     1   1
str_locate("가나가나","가")
     start end
[1,]     1   1
str_locate("가나나가","나")
     start end
[1,]     2   2
str_locate("가나나가","나나")
     start end
[1,]     2   3

만약 매칭되는 모든 문자열의 시작과 끝 위치를 확인하고 싶다면?? str_locate_all()을 사용합니다.

(7) str_locate_all()

원하는 특정 문자와 매칭되는 모든 문자열의 시작과 끝 위치 확인을 위해 사용되는 함수입니다.

str_locate_all("가나가나","가")
[[1]]
     start end
[1,]     1   1
[2,]     3   3

str_locate_all("가나나가","나")
[[1]]
     start end
[1,]     2   2
[2,]     3   3

str_locate_all("가나나가","나나")
[[1]]
     start end
[1,]     2   3

(8) str_split()

특정 기호를 기준으로 문자열을 분리할때 사용하는 함수입니다. 

 str_split('안녕하세요/빅공이에요/반갑습니다','/')
[[1]]
[1] "안녕하세요" "빅공이에요" "반갑습니다"

다음과 같이 뒤에 기준으로 삼을 기호를 넣어줍니다.

(9) str_trim()

공백을 제거할때 사용하는 함수입니다. 공백 제거 방향을 옵션으로 선택하는데 단, 중간 공백을 삭제를 하지 않습니다.

# 왼쪽 공백 제거
str_trim('  안녕하세요 빅공이에요 반갑습니다  ', side='left')
[1] "안녕하세요 빅공이에요 반갑습니다  "
# 오른쪽 공백 제거
> str_trim('  안녕하세요 빅공이에요 반갑습니다  ', side='right')
[1] "  안녕하세요 빅공이에요 반갑습니다"
# 양쪽 공백 제거
> str_trim('  안녕하세요 빅공이에요 반갑습니다  ')
[1] "안녕하세요 빅공이에요 반갑습니다"

그렇다면 중간 공백을 삭제하고 싶을땐 어떤 함수를 사용해야 할까요?? 바로 str_replace함수입니다.

(10) str_replace

처음으로 매칭이 되는 문자의 값만 치환과 삭제를 해주는 함수입니다.

str_replace('안녕하세요 빅공이에요','요','용')    
[1] "안녕하세용 빅공이에요"

다음과 같이 하면 요를 용으로 치환하지만, 처음으로 매칭되는 값만 바뀌게 됩니다.

str_replace('안녕하세요 빅공이에요',' ','')    
[1] "안녕하세요빅공이에요"

만약 중간 공백을 없애고 싶다면 다음과 같이 공백인 부분을 ''로 치환해 주면 됩니다.

 

그렇다면 처음으로 매칭되는 문자가 아닌 모든 문자를 바꾸고 싶을때는 어떤 함수를 사용해야 할까요? 바로 str_replace_all 함수입니다.

 str_replace_all('안녕하세요 빅공이에요','요','용')    
[1] "안녕하세용 빅공이에용"

다음과 같이 모두 바뀐것을 확인하였습니다. str_replacestr_replace_all은 필요에 맞게 적절하게 사용하는 것이 중요합니다.

(11) str_dup()

문자열을 반복하여 생성하는 함수입니다.

a
[1] "빅공"   "파이썬" "R"     
str_dup(a,3)
[1] "빅공빅공빅공"       "파이썬파이썬파이썬" "RRR"  

다음과 같이 반복하고 싶은 횟수를 입력해주면 문자열을 반복해서 생성합니다.

 

 

 

참고

data-make.tistory.com/42

 

[R] 문자열 관련 함수 - stringr 패키지, 정규식

문자열 함수 - Stringr 패키지  stringr 패키지는 문자열 데이터를 가공하기 위해 자주 사용되는 유용한 패키지입니다. 문자열 치환, 벡터 연산, 함수의 결과를 반복문없이 저장해주는 등 편리한

data-make.tistory.com