[R] 문자열 (grep, toupper, tolower/ str_count, strsplit) 및 function, reverse letter/word 등

 

# 특정 문자 포함하는 data 찾기

✔︎ grep("a", xyz, value=TRUE)

   : a라는 문자를 포함하는 data 찾기 (대소문자 구분 필요)

   * value=TRUE로 해야 data 값이 나옴

      value를 지정안하면(=FALSE) 해당 data 위치가 나옴

 

cars <- rownames(mtcars)

# 어떤 문자를 포함하는 data 찾기 (대소문자 구분)
> grep("v", cars, value=TRUE)
[1] "Hornet 4 Drive" "Honda Civic"    "AMC Javelin"    "Volvo 142E" 

> grep("V", cars, value=TRUE)
[1] "Valiant"    "Volvo 142E"

> grep("v", cars)
[1]  4 19 23 32

# 대소문자 구분 없이 해당 문자 포함하는 data 찾기
> grep("[vV]", cars, value=TRUE)
[1] "Hornet 4 Drive" "Valiant"        "Honda Civic"    "AMC Javelin"    "Volvo 142E"

> grep("v", tolower(cars), value=TRUE)
[1] "hornet 4 drive" "valiant"        "honda civic"    "amc javelin"    "volvo 142e"

> grep("MERC", toupper(cars), value=TRUE)
[1] "MERC 240D"   "MERC 230"    "MERC 280"    "MERC 280C"   "MERC 450SE"  "MERC 450SL" 
[7] "MERC 450SLC"

 

 

문자 데이터 정리를 위한 패키지(stringr) 설치

✔︎ install.packages("stringr")

# 특정 data의 개수 찾기

✔︎ sum(str_count(xyz, "a"))

cars <- rownames(mtcars)

library(stringr)

# FIAT의 개수 찾기
> str_count(toupper(cars),"FIAT")
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0

> sum(str_count(toupper(cars),"FIAT"))
[1] 2

 

# 단어 분리하고 합치기

✔︎ strsplit(xyz, split="a")

   : a 기준으로 단어 분리

 

✔︎ paste(xyz, collapse="a")

   : a 기준으로 단어 붙이기

# 단어 분리하기 (띄어쓰기로 구분)
strsplit("abc def xyz", split =" ")
[[1]]
[1] "abc" "def" "xyz"

# 철자 분리하기 (철자 하나하나 구분)
a <- strsplit("abc def xyz", split ="")
> a
[[1]]
 [1] "a" "b" "c" " " "d" "e" "f" " " "x" "y" "z"

> class(a)
[1] "list"

# 분리한 단어 붙이기 -> 실패
paste(a[[1]])
 [1] "a" "b" "c" " " "d" "e" "f" " " "x" "y" "z"

# 분리한 단어 제대로 붙이기 (철자 하나하나씩)
paste(a[[1]],collapse="")
[1] "abc def xyz"

 

 

# Reverse Letters & 일반 함수화

✔︎ function(xyz){~~}

   : abc에 입력한 값을 ~~로 바꿔라

a <- strsplit("abc def xyz", split ="")

# 거꾸로 글자 나열 (글자 수를 알아야 11번째 글자부터 나열하라고 지정 가능)
reversed <- a[[1]][11:1]
> reversed
 [1] "z" "y" "x" " " "f" "e" "d" " " "c" "b" "a"
 
paste(reversed,collapse="")
[1] "zyx fed cba"
 
# 거꾸로 글자 나열하는 것을 일반 함수화
reverse_mine <- function(abc){
 b <- strsplit(abc, split="")
 reversed <- b[[1]][nchar(abc):1]
 paste(reversed, collapse="")
}
 
reverse_mine("abc def xyz")
[1] "zyx fed cba"

 

# Reverse Words & 일반 함수화

# 단어를 거꾸로
a <- strsplit("abc def xyz", split =" ")
reversed <- a[[1]][3:1]
paste(reversed,collapse=" ")
[1] "xyz def abc"
 

# 단어를 거꾸로 (일반 함수화)
 
rev_word <- function(abc){
  b <- strsplit(abc, split =" ")
  abc_length <- length(b[[1]])
  reversed <- b[[1]][abc_length:1]
  paste(reversed,collapse=" ")
}
 
rev_word("abc def xyz")
[1] "xyz def abc"