R gsub 공백 제거 - R gsub gongbaeg jegeo

/*

 http://sosal.kr/
 * made by so_Sal
 */

find0 라는 파일에 integer pair가 저장되어 있는데

끝에 " 라는 문자때문에 프로그래밍 안에서 바로 연산을 할 수 없는 상황이었습니다.

R gsub 공백 제거 - R gsub gongbaeg jegeo

[sosal@sosalr tmp]$ head ./find0
8 1540"
8 3436"
8 3454"
8 6484"
8 6760"
8 7291"
8 7921"
8 7984"
8 10331"
8 10993"

pair <- read.table("find0", sep="", header=FALSE, stringsAsFactors=FALSE)

이렇게 읽게 되면 V1, V2 column이 다른 형태의 변수로 읽어지게 됩니다.

> head(pair)
  V1    V2
1  8 1540"
2  8 3436"
3  8 3454"
4  8 6484"
5  8 6760"
6  8 7291"

> typeof(pair[1,1])
[1] "integer"
> typeof(pair[1,2])
[1] "character"
>

integer로 읽혀야 할 것이, character로 읽혀저 버립니다.

- 해결책

pair[,2] <- as.integer(gsub("\"", "", pair[,2]))

gsub을 이용하여 " 라는 문자열을 모두 공백문자로 바꿔주고, interger 형태로 형변환을 해주면 완료됩니다.

> head(pair)
  V1   V2
1  8 1540
2  8 3436
3  8 3454
4  8 6484
5  8 6760
6  8 7291
> typeof(pair[1,1])
[1] "integer"
> typeof(pair[1,2])
[1] "integer"
>

안녕하세요, 이번 포스팅에서는 문자열을 다루는 함수에 대해서 알아보도록 하겠습니다. 최근에 텍스트마이닝에 대한 중요성이 강조되고 있기 때문에 텍스트 데이터를 다루는 일이 많아졌습니다. 텍스트를 다루는데에 유용하고, 자주 사용되는 함수를 알려드리도록 하겠습니다.

우선 함수들에 대해 알아보기에 앞서 텍스트의 패턴을 찾을 때 사용되는 정규 표현식을 알려드리도록 하겠습니다.

[:digit:] 혹은 \d : 숫자, 0,1,2,3,4,5,6,7,8,9, 동등한 표현 [0-9].

\D : 숫자가 아님, 동등한 표현 [^0-9].

[:lower:] : 영문 소문자, 동등한 표현 [a-z].

[:upper:] : 영문 대문자, 동등한 표현 [A-Z].

[:alpha:] : 알파벳 대소문자, 동등한 표현 [[:lower:][:upper:]] 혹은 [A-z]

[:alnum:] : 알파벳 숫자 문자, 동등한 표현 [[:alpha:][:digit:]] 혹은 [A-z0-9].

\w : 단어 문자, 동등한 표현 [[:alnum:]] 혹은 [A-z0-9].

\W : 단어가 아닌 것, 동등한 표현 [^A-z0-9].

[:xdigit:] : 16진수 (밑이 16), 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f, 동등한 표현 [0-9A-Fa-f].

[:blank:] : 간격 문자, 즉 스페이스와 탭.

[:space:] : 공백 문자: 탭, 개행문자, 수직탭, 공백, 복귀문자, 서식이송(form feed)

\s : 간격, ` `.

\S : 간격 아님.

[:punct:] : 구두점 문자, ! " # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~.

[:graph:] : 그래픽 (사람이 읽을 수 있는) 문자, 동등한 표현 [[:alnum:][:punct:]].

[:print:] : 출력가능한 문자, 동등한 표현 [[:alnum:][:punct:]\\s].

[:cntrl:] : \n, \r 같은 제어문자, 동등한 표현 [\x00-\x1F\x7F].

① grep, grepl

grep

grep(pattern, x, ignore.case = F, value = F)

grepl

grepl(pattern, x, ignore.case = F)

grep 함수와 grepl 함수는 x라는 문자열에서 해당 패턴이 존재하는가를 알아보는 함수입니다. ignore.case = T 로 바꿀 경우, 해당 패턴에 대하여 대소문자 구분없이 존재하는가를 알려줍니다. grep 함수는 index를 출력하지만, grepl은 TRUE, FLASE를 출력합니다. 이 때, grep 함수에서 value = T 로 바꿔주면 index가 아닌 문자열이 출력됩니다.

txt <- c("BigData", "Bigdata", "bigdata", "Data", "dataMining", "class1", "class5") 
grep("data", txt) 
[1] 2 3 5 

grep("data", txt, ignore.case = T) 
[1] 1 2 3 4 5 

grep("data", txt, value = T) 
[1] "Bigdata" "bigdata" "dataMining" 

grep("^b+",txt, value=TRUE) 
[1] "bigdata" 

grepl("data", txt) 
[1] FALSE TRUE TRUE FALSE TRUE FALSE FALSE

위의 예시를 보시면, grep 함수를 통해 data가 들어간 문자열의 위치인 2,3,5가 출력되며, ignore.case = T를 추가할 경우, 대소문자 구분없이 data가 들어간 문자열의 위치인 1,2,3,4,5 가 출력되게 됩니다. 또한 value = T 를 추가할 경우, 위치가 아닌 문자열이 출력됩니다. 또한 정규표현식을 통해 b로시작하는 단어인 'bigdata'만 출력되는 것을 확인할 수 있습니다. 마지막으로 grepl은 위치가 아니라 TRUE와 FALSE 값으로 출력이 됩니다.

② gsub

gsub

gsub(pattern, replacement, x, ignore.case = F)

gsub 함수는 해당 패턴을 가지는 문자열을 x에서 발견하여, replacement로 바꿔주는 함수입니다. ignore.case 의 기능은 grep 함수와 같다고 생각하시면 됩니다.

gsub("big","small", txt, ignore.case = T) 
[1] "smallData" "smalldata" "smalldata" "Data" "dataMining" "class1" "class5" 

gsub("[[:digit:]]","", txt) 
[1] "BigData" "Bigdata" "bigdata" "Data" "dataMining" "class" "class"

위의 예시를 보시면, txt에 대소문자 상관없이 존재하는 big이 small로 변한것을 확인 할 수 있습니다.

또한, 이에 대한 활용으로 정규표현식을 통해 모든 숫자들을 없앨 수 있습니다.

③ strsplit, substr

strsplit

strsplit(x, split)

substr

substr(x, start, stop)

strsplit 함수는 문자열을 쪼개는 함수이며, substr 함수는 문자열에서 시작위치과 끝위치을 정하여 추출해내는 함수입니다.

test = "Text data is very important" strsplit(test, ' ') 
[[1]] 
[1] "Text" "data" "is" "very" "important" 

substr("abcdef", 2, 4) 
[1] "bcd"

위의 예시를 보시면, strsplit 함수를 이용하여 뛰어쓰기를 기준으로 test 문자열이 쪼개지는 것을 확인 할 수 있습니다.

또한, substr 함수에 시작위치와 끝위치를 인자로 주어, 2번째부터 4번째까지의 문자열이 출력됩니다.