위의 데이터를 가지고 진행합니다.
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>
'데이터 전처리 > R' 카테고리의 다른 글
ggplot을 이용한 데이터 시각화 - geom_bar(),geom_histogram() (0) | 2024.06.17 |
---|---|
파이썬 split,replace,extract [R ver.] (1) | 2024.06.11 |
자주 쓰이는 apply계열 함수 사용법 in r (0) | 2024.06.04 |
날짜 데이터 전처리 [in R] -strptime,str_extract(),substr() (0) | 2024.05.15 |
수치형 데이터 전처리 [in R] (0) | 2024.05.14 |