본문 바로가기

데이터 전처리/R

gsub()함수 기본 사용법 in r

schedule.csv
0.00MB

 

위의 데이터를 가지고 진행합니다.

gsub() : 데이터의 원소를 A->B로 '모두' 변환해주는 함수

Pattern 변환 할 원소 
replacement  대체 원소

아래는 잘못 된 예시입니다.

gsub(pattern = '1,2,3',replacement = NA,x=df)
> gsub(pattern = '1,2,3',replacement = NA,x=df)
[1] "9:18"                                                                  
[2] NA                                                                      
[3] NA                                                                      
[4] NA                                                                      
[5] "c(\"3\", \"3\", \"\", \"3\", \"1,2\", \"3\", \"1\", \"1\", \"\", \"\")"
[6] "c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)"

문제가 없다고 생각이 될 수 있으나, gsub()는 벡터형 데이터만 가능합니다.

그렇기에 아래와 같이 진행하면 변환이 가능합니다.

gsub(pattern = '1,2,3',replacement = NA, x = df$월)
> gsub(pattern = '1,2,3',replacement = NA, x = df$월)
 [1] NA    NA    "1,2" "1,2" "3"   "2,3" "1,3" "1"   ""    "2"

 

대게 금액표시(달러,원화,엔화), '1,400' 같이 ','가 들어가 있는 경우에 사용 됩니다.

 

아래는 특정 상황에서 사용되는 pattern입니다.

text <- '<html dir="ltr" lang="ko" chrome-refresh-2023="" class="focus-outline-visible" lazy-loaded="true">'
gsub(pattern = '<.*?>', replacement = '괄호까지 다 지우기',x = text)
>gsub(pattern = '<.*?>', replacement = '괄호까지 다 지우기',x = text)
[1] "괄호까지 다 지우기"

괄호까지 포함 한 내용을 싹 다 지워버리는 방법입니다. 위의 html을 처리 할 때 유용합니다.

 

#위문자는 R에서 차원접근, 벡터 접근에 사용되는 두 문자들임.
text2 <- '날짜 데이터 전처리 [in R]'
text3 <- '수치형 데이터 전처리 (in R)'
#안되는 예시
gsub(pattern = '[.*?]', replacement = 'R', x = text2)
gsub(pattern = '(.*?)', replacement = 'R', x= text3)
#되는 예시
gsub(pattern = '\\[.*?\\]', replacement = 'R', x = text2)
gsub(pattern = '\\(.*?\\)', replacement = 'R', x= text3)

> gsub(pattern = '\\[.*?\\]', replacement = 'R', x = text2)
[1] "날짜 데이터 전처리 R"
> gsub(pattern = '\\(.*?\\)', replacement = 'R', x= text3)
[1] "수치형 데이터 전처리 R"

()와 []는 조심히 다뤄야 하는 문자인데, 이유는 차원접근과 벡터 접근에 사용되는 문자들이기 때문입니다. df[],c() 이런 식으로 말입니다. 왜 한글 수식에서 {}을 사용하려면 left{ right} 이렇게 적는 이유와 비슷합니다. 

그래서 '\\(', '\\[' 와 같이 포멧을 맞춰주어야합니다. 

 

또 하나의 패턴인 공백('')을 처리하는 방법입니다. 사실 포스팅의 이유가 공백('')처리하는데 있어 애를 먹었기 때문에 보시는 분들도 쉽게 하실 수 있게 올립니다. 

gsub(pattern = '',replacement = NA, x = df$월)
> gsub(pattern = '',replacement = NA, x = df$월)
 [1] NA NA NA NA NA NA NA NA NA NA
 
 
 > df$월
 [1] "1,2,3" "1,2,3" "1,2"   "1,2"   "3"     "2,3"   "1,3"   "1"     ""      "2"

모든 원소들이 NA로 변환되었습니다. 그냥 '1,2' 같이  ' "과 " 1 " 사이에 공백이라고 인식해버리기 때문입니다. 우리는 뒤에서 두 번째 원소만 NA를 쳐야하는데 나머지가 다 되었기 때문에  다른 방법이 필요합니다.

아래와 같이 한 번에 처리하면 됩니다. 

> apply(df, 2, function(x) ifelse(x == "", NA, x))
      X    월      화      수      목    금
 [1,] " 9" "1,2,3" "1,2,3" "3"     "3"   NA
 [2,] "10" "1,2,3" "1,2,3" "1,3"   "3"   NA
 [3,] "11" "1,2"   "1,2,3" "1"     NA    NA
 [4,] "12" "1,2"   "1,2,3" "1"     "3"   NA
 [5,] "13" "3"     NA      "1,2"   "1,2" NA
 [6,] "14" "2,3"   "1,2"   "1,2,3" "3"   NA
 [7,] "15" "1,3"   "1,2"   NA      "1"   NA
 [8,] "16" "1"     "3"     NA      "1"   NA
 [9,] "17" NA      "2,3"   NA      NA    NA
[10,] "18" "2"     NA      NA      NA    NA

> as.data.frame(apply(df, 2, function(x) ifelse(x == "", NA, x)))
    X    월    화    수   목   금
1   9 1,2,3 1,2,3     3    3 <NA>
2  10 1,2,3 1,2,3   1,3    3 <NA>
3  11   1,2 1,2,3     1 <NA> <NA>
4  12   1,2 1,2,3     1    3 <NA>
5  13     3  <NA>   1,2  1,2 <NA>
6  14   2,3   1,2 1,2,3    3 <NA>
7  15   1,3   1,2  <NA>    1 <NA>
8  16     1     3  <NA>    1 <NA>
9  17  <NA>   2,3  <NA> <NA> <NA>
10 18     2  <NA>  <NA> <NA> <NA>