R에서 프로젝트 사용하기

RStudio 프로젝트를 사용하면 작업 공간과 문서를 쉽게 관리 할 수 있습니다.

프로젝트 만들기

RStudio 프로젝트는 R 작업 디렉토리와 연결됩니다. RStudio 프로젝트를 다음과 같은 곳에 만들 수 있습니다. :

  • 새로운 디렉토리에서
  • 또는 이미 R 코드 및 데이터가 있는 기존 디렉토리에서 만들 수 있습니다.

새로운 프로젝트를 만들 때, R studio는 :

  1. 프로젝트 디렉토리에 (.Rproj 확장자를 가진) 프로젝트 파일을 생성합니다. 이 파일에는 다양한 프로젝트 옵션이 있고 프로젝트를 직접 여는 지름길로 파일을 사용합니다.
  2. 원본 문서와 창 상태가 저장된 숨겨진 디렉토리를 만듭니다.
  3. 프로젝트를 저장하고 툴바에 프로젝트 이름을 나타냅니다.

프로젝트 열기

  1. Open Project 명령어를 사용하여 기존 프로젝트 파일(예: BigData_TextMining.Rproj)을 찾아 선택합니다.
  2. 또는 최근 열었던 프로젝트 목록에서 프로젝트를 선택합니다.

프로젝트 종료하기

프로젝트를 종료하거나 다른 프로젝트를 열면 다음 작업이 실행됩니다. :

  • .RData 및/또는 .Rhistory 는 프로젝트 디렉토리에 기록됩니다.
  • 오픈 소스 문서(.R 확장 문서) 목록이 저장됩니다. (다음 번에 프로젝트를 열 때, 복원할 수 있습니다.)

Global 옵션 확인

작업 내용이 올바르게 저장되도록 global 옵션을 확인해 봅시다.

  • Restore .RData into workspace at startup - 시작 시, R 작업 공간(전역 환경) 안에 초기 작업 디렉토리에 있는 .RData 파일(있는 경우)을 저장하세요.
  • Save workspace to .RData on exit - 종료 시, .RData를 저장할지 여부를 묻고 항상 저장하거나 저장하지 않습니다.
  • Always save history (even when not saving .RData) - 종료할 때, .RData 파일을 저장하지 않기로 선택하더라도 세션의 명령을 사용하여 .Rhistory 파일이 항상 저장되는지 확인하세요.

벡터 함수

# R은 객체 지향 프로그래밍 언어입니다. 모든 것을 객체에 할당 할 수 있습니다. 
fruits <- c("Apple","Grape","Pear","Apple","Mango","Orange","Mango","Strawberry","Grape","Apple")
sort(fruits) # 문자의 알파벳 순서로 정렬된 객체, 여기에선 과일 이름들을 반환합니다. 
##  [1] "Apple"      "Apple"      "Apple"      "Grape"      "Grape"     
##  [6] "Mango"      "Mango"      "Orange"     "Pear"       "Strawberry"
table(fruits) # 값들의 개수
## fruits
##      Apple      Grape      Mango     Orange       Pear Strawberry 
##          3          2          2          1          1          1
unique(fruits) # 고유값 확인 
## [1] "Apple"      "Grape"      "Pear"       "Mango"      "Orange"    
## [6] "Strawberry"

벡터 요소 선택

position(자리 순서)을 사용하여 선택합니다.

fruits[4] # 벡터 객체, fruits의 4번째 요소
## [1] "Apple"
fruits[-4] # 4번째를 제외한 모든 것 
## [1] "Apple"      "Grape"      "Pear"       "Mango"      "Orange"    
## [6] "Mango"      "Strawberry" "Grape"      "Apple"
fruits[2:4] # 2번째 ~ 4번째까지의 요소
## [1] "Grape" "Pear"  "Apple"
fruits[-(2:4)] # 2번째 ~ 4번째 요소를 제외한 모든 것 
## [1] "Apple"      "Mango"      "Orange"     "Mango"      "Strawberry"
## [6] "Grape"      "Apple"
fruits[c(1,5)] # 1번째 요소와 5번째 요소
## [1] "Apple" "Mango"

value(값)를 사용하여 선택합니다.

fruits[fruits == "Apple"] # "Apple"과 같은 글자인 요소
## [1] "Apple" "Apple" "Apple"
fruits["Apple"]
## [1] NA
# == 는 '같다'는 의미입니다. 
# = 는 함수에서 인수를 설정하기 위한 것입니다.(예 : seq(1, 5, by=2))
# != 는 '같지 않다'를 의미합니다. 
fruits[fruits != "Apple"] # "Apple"과 같은 요소를 제외한 모든 요소 
## [1] "Grape"      "Pear"       "Mango"      "Orange"     "Mango"     
## [6] "Strawberry" "Grape"
# %in% 는 다음 벡터에 포함된 요소를 식별합니다. 
#  "Apple", "Mango", "Kiwi"로 이루어진 집합에 포함되는 요소
fruits[fruits %in% c("Apple","Mango","Kiwi")] 
## [1] "Apple" "Apple" "Mango" "Mango" "Apple"

참고 : 특정 함수의 괄호 () 안에는 객체를 적지만, 대괄호는 [] 벡터 요소를 선택합니다.

toupper(fruits[3]) 
## [1] "PEAR"
tolower(fruits[3])
## [1] "pear"

list( )

벡터 객체란 무엇일까요? - 벡터 객체 : 같은 성격을 가진 정렬된 요소들의 모음

예) 숫자 벡터, 문자 벡터, 논리 벡터…

그런 세 종류의 벡터 객체를 가지고 싶다면 어떻게 해야 할까요?

’c()’함수가 어떤 일을 하는지 기억해봅시다.

# 수열을 숫제 벡터 객체에 할당합니다.
vector_numeric <- c(1:6) # 1~6까지 일련 번호
vector_numeric
## [1] 1 2 3 4 5 6
# 문자열을 문자 벡터 객체, vector_character에 할당합니다. 
vector_character <- c("v","e","c","t","o","r") # 문자는 따옴표로 구분해야합니다. 
vector_character
## [1] "v" "e" "c" "t" "o" "r"
# 부울값 TRUE 또는 FALSE를 논리 벡터 객체인 vector_logical에 할당합니다. 
vector_logical <- c(TRUE, FALSE, FALSE, TRUE, T, F) # TRUE/FALSE 는 대문자여야합니다. 
vector_logical
## [1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

리스트 객체란 무엇일까요?

가능한 여러 다른 종류들로 이루어진 벡터입니다. 즉, 리스트는 다른 유형의 벡터 객체가 될 수 있는 요소들의 모음입니다.

리스트의 요소에는 숫자 벡터, 문자 벡터 및 논리 벡터가 동시에 포함될 수 있습니다.

텍스트 마이닝에서 list() 가 중요한 이유는 무엇일까요?

텍스트 데이터는 여러 부분으로 분석됩니다. list() 함수는 계층적 데이터를 다루는데 유용합니다.

Ex) 문서 > 단락 > 문장 > 단어

BTS에 대한 다음의 2가지 문장이 있다고 가정해보겠습니다.

Ex) BTS <- “BTS is known as the Bangtan Boys. And BTS is a seven-member South Korean boy band.”

문자 객체 BTS는 2개의 문장의 리스트일 수 있고, 벡터로서의 각 문장은 일련의 단어를 포함합니다.

# 예: 다음 객체로 구성된 리스트 
obj1 <- c("BTS","is","known","as","the","Bangtan Boys")
obj2 <- c("And", "BTS","is","a","seven-member","South Korea","boy band")
MyList <- list(obj1, obj2)
class(obj1) # 벡터인가요, 리스트인가요?
## [1] "character"
class(obj2) # 벡터인가요, 리스트인가요?
## [1] "character"
class(MyList) # 벡터인가요, 리스트인가요?
## [1] "list"

인덱싱 : 특정 요소 선택하기

리스트에서 특정 요소를 어떻게 선택할 수 있을까요? 리스트의 이중대괄호 [[ ]] 와 벡터의 단일대괄호 [ ] 를 사용하세요. [[ ]] 는 리스트 요소의 하위 요소를 반환합니다.

MyList[[1]] # 리스트 MyList의 첫번째 요소가 있는 벡터를 반환합니다. 
## [1] "BTS"          "is"           "known"        "as"          
## [5] "the"          "Bangtan Boys"
class(MyList[[1]]) # MyList의 첫번째 요소는 6 단어가 있는 문자 벡터입니다.
## [1] "character"

질문

  1. 리스트 객체, MyList의 2번재 요소의 벡터를 반환하세요.
  2. 리스트 객체, MyList의 첫번째 요소의 3번째 값을 반환하세요.

리스트를 벡터로 바꾸는 법

#unlist( ) 는 리스트 객체를 벡터 객체로 변환하는 함수입니다. 
class(MyList[2])
## [1] "list"
MyList[2] # 6개의 요소를 가지는 리스트 객ㅊ
## [[1]]
## [1] "And"          "BTS"          "is"           "a"           
## [5] "seven-member" "South Korea"  "boy band"
class(MyList[[2]]) # 문자 벡터 객체 vector_character
## [1] "character"
MyList[[2]]
## [1] "And"          "BTS"          "is"           "a"           
## [5] "seven-member" "South Korea"  "boy band"
unlist(MyList[2]) # 리스트 객체를 벡터 객체로 변환합니다. 
## [1] "And"          "BTS"          "is"           "a"           
## [5] "seven-member" "South Korea"  "boy band"

텍스트 마이닝에서는 언제 unlist( )를 사용할까요?

단락의 단어 리스트를 단어로 이루어진 벡터 객체로 변환 할 수 있습니다.

# 문자 벡터 리스트를 벡터 객체로 구성 
paragraph <- paste(MyList[[1]],MyList[[2]],collapse=" ") # 두 벡터를 연결 
paragraph
## [1] "BTS And is BTS known is as a the seven-member Bangtan Boys South Korea BTS boy band"
para_list <- strsplit(paragraph, split=" ") # 리스트 객체를 반환
para_list
## [[1]]
##  [1] "BTS"          "And"          "is"           "BTS"         
##  [5] "known"        "is"           "as"           "a"           
##  [9] "the"          "seven-member" "Bangtan"      "Boys"        
## [13] "South"        "Korea"        "BTS"          "boy"         
## [17] "band"
class(para_list)
## [1] "list"
para_vector <- unlist(para_list) # 리스트를 벡터 객체로 뒤바꿉니다.
para_vector
##  [1] "BTS"          "And"          "is"           "BTS"         
##  [5] "known"        "is"           "as"           "a"           
##  [9] "the"          "seven-member" "Bangtan"      "Boys"        
## [13] "South"        "Korea"        "BTS"          "boy"         
## [17] "band"
class(para_vector)
## [1] "character"

unlist( ) 는 리스트 객체의 요소를 벡터 객체에 결합 할 수 있게 합니다. 단, unlist 함수를 사용할 때는 주의해야 합니다.

질문

문자 벡터 객체인 unlist(paragraph), 를 단어를 공백으로 묶는 문장으로 바꾸는 방법은 무엇입니까?

문자와 문자열

R에서 문자 백터의 유형(class)은 "character"입니다. 그리고 문자 벡터의 요소를 결합한 결과는 문자열입니다. 즉, 문자열은 문자 벡터의 요소를 단일 객체로 연결한 결과와 같습니다. 따라서, 문자열은 텍스트 조각(예: 단어/문장)의 컨테이너입니다. 가령, 문자열은 SV1 <- "Text mining is interesting!", "Is RStudio easy to learn? Many people say so, indeed."와 같습니다.

우리가 이 수업에서 주로 할 일은 문자열인 string 객체를 문자 백터로 변환하는 일입니다.

큰 따옴표로 둘러싸인 텍스트로 문자열을 표현할 수 있습니다.:

string1 <- "a character string is surrounded by double quotes"

또는 작은 따옴표 안에 텍스트를 둘러 쌀 수도 있습니다.:

string2 <- 'a character string is surrounded by single quotes'

우리가 사용하고 있는 따옴표의 유형과 일치해야 합니다. 작은 따옴표로 시작하였으면, 끝에도 작은 따옴표를 사용해야 합니다.

R에서 문자열의 일반적인 사용

위의 예제에서처럼 R에 문자를 일일이 입력하는 것은 그다지 유용하지 않습니다. 대신 우리는 이러한 문자열을 포함하는 텍스트를 다운로드 받아 객체 또는 변수로 변환하고 처리하는 방식의 분석을 수행하려고 합니다. 다시 말해, R을 이용한 텍스트 분석의 목적은 문자열을 문자 벡터로 변환하는 것(즉, 토큰화)부터 시작합니다. 이를 위해서 우리는 "stringr"패키지를 이용해 문자열을 사전 처리 하는 과정을 학습할 것입니다.

stringr이란?

stringr은 텍스트 사전 처리를 위해 특별히 만들어진 패키지입니다. 이 패키지는 문자열을 보다 일관되고 간단하고 쉽게 처리할 수 잇는 유용한 함수 3가지를 제공합니다.

  1. 문자 조작 : 이 함수는 문제 벡터 객체의 문자열 내에서 개별 문자를 조작합니다.
  2. 공백을 추가, 제거 및 조작하는 공백 도구
  3. 패턴 일치 함수 : 이 함수는 대부분 정규 표현식을 인식합니다.

이 패키지의 함수는 nchar(), paste(), strsplit()과 같은 R의 문자열 처리를 위한 기본 함수보다 더 특화된 기능을 제공합니다. 우리는 install.packages()함수를 사용하여 패키지를 설치하고 현재 세션에 library()를 이용해서 함수를 이용할 준비를 할 수 있습니다.

기본 문자열 연산

stringr패키지는 1) 기본 조작과 2) 정규 표현식 작업을 위한 기능을 제공합니다. 첫째, 우리는 기본적인 조작과 관련된 기능들을 다루어볼 것입니다.

다음 표는 기본 문자열 연산을 위한 stringr() 함수를 보여줍니다.

함수 정의 유사한 기본 함수
str_length() 문자의 수 nchar()
str_split() 문자 분리 strsplit()
str_c() 문자 연결 paste()
str_detect() 문자열의 패턴 유무 인식 none
str_view_all() 매칭된 문자열 모두를 보여줌 none

stringr에 있는 모든 함수는 "str_"로 시작하고 함수가 실행되는 작업과 관련된 용어가 따라옵니다.

str_length()로 문자열의 문자 수를 셉니다.

str_length() 함수는 기본 함수 nchar()와 같습니다. 두 함수는 각 문자열에 있는 문자 수의 벡터, 즉 문자열의 _length_를 반환합니다. (벡터의 length()와 혼동하지 마세요!).

library(stringr)
paragraph
## [1] "BTS And is BTS known is as a the seven-member Bangtan Boys South Korea BTS boy band"
str_length(paragraph)
## [1] 83
nchar(paragraph)
## [1] 83
para_vector[1:10] # 문자 벡터의 처음 10개 요소
##  [1] "BTS"          "And"          "is"           "BTS"         
##  [5] "known"        "is"           "as"           "a"           
##  [9] "the"          "seven-member"
str_length(para_vector)[1:10] # 처음 10개 요소의 문자 길이를 반환합니다. 
##  [1]  3  3  2  3  5  2  2  1  3 12
para_vector[str_length(para_vector)>3][1:20] # 문자 길이가 3보다 큰 요소를 반환합니다. 
##  [1] "known"        "seven-member" "Bangtan"      "Boys"        
##  [5] "South"        "Korea"        "band"         NA            
##  [9] NA             NA             NA             NA            
## [13] NA             NA             NA             NA            
## [17] NA             NA             NA             NA

문자열을 str_split()으로 나눕니다.

str_split() 함수는 기본 함수 strsplit()와 같습니다. 두 함수는 문자열을 여러 개의 조각으로 분할하고 문자 벡터 리스트를 반환합니다.

paragraph
## [1] "BTS And is BTS known is as a the seven-member Bangtan Boys South Korea BTS boy band"
strsplit(paragraph, split=" ") # " "로 문자열 벡터를 조각으로 나눕니다.
## [[1]]
##  [1] "BTS"          "And"          "is"           "BTS"         
##  [5] "known"        "is"           "as"           "a"           
##  [9] "the"          "seven-member" "Bangtan"      "Boys"        
## [13] "South"        "Korea"        "BTS"          "boy"         
## [17] "band"
str_split(paragraph, " ") # 위와 같습니다.
## [[1]]
##  [1] "BTS"          "And"          "is"           "BTS"         
##  [5] "known"        "is"           "as"           "a"           
##  [9] "the"          "seven-member" "Bangtan"      "Boys"        
## [13] "South"        "Korea"        "BTS"          "boy"         
## [17] "band"

str_c()와 연결하기

이 함수는 기본 함수 paste()와 같습니다.

para_vector
##  [1] "BTS"          "And"          "is"           "BTS"         
##  [5] "known"        "is"           "as"           "a"           
##  [9] "the"          "seven-member" "Bangtan"      "Boys"        
## [13] "South"        "Korea"        "BTS"          "boy"         
## [17] "band"
paste(para_vector, collapse = " ") # 문자 벡터를 문자열로 연결합니다.  
## [1] "BTS And is BTS known is as a the seven-member Bangtan Boys South Korea BTS boy band"
str_c(para_vector, collapse = " ")
## [1] "BTS And is BTS known is as a the seven-member Bangtan Boys South Korea BTS boy band"

str_detect()으로 문자열의 패턴을 인식합니다.

이 함수는 문자열의 패턴의 유(TRUE)무(FALSE)를 감지하고 반환합니다.

para_vector
##  [1] "BTS"          "And"          "is"           "BTS"         
##  [5] "known"        "is"           "as"           "a"           
##  [9] "the"          "seven-member" "Bangtan"      "Boys"        
## [13] "South"        "Korea"        "BTS"          "boy"         
## [17] "band"
str_detect(para_vector, "a") # 문자 백터에서 "a"와 매칭된 요소를 반환합니다. 
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE
## [12] FALSE FALSE  TRUE FALSE FALSE  TRUE
which(str_detect(para_vector, "a")) # 이 함수는 논리 객체의 TRUE 인덱스만 보여줍니다.
## [1]  7  8 11 14 17

str_view_all()으로 매칭된 문자열 모두를 확인합니다.

이 함수는 특정 표현이 매칭되는 결과를 화면으로 보여줍니다.

para_vector
##  [1] "BTS"          "And"          "is"           "BTS"         
##  [5] "known"        "is"           "as"           "a"           
##  [9] "the"          "seven-member" "Bangtan"      "Boys"        
## [13] "South"        "Korea"        "BTS"          "boy"         
## [17] "band"
str_view_all(para_vector, "a") # "a"와 매칭된 문자를 보여줍니다.