R에서 외부 자료를 불러올 때 기본 포맷으로 .csv를 사용한다. 그러나, 현실에서 많은 사용자들은 그냥 엑셀포맷 .xlsx를 이용하는 경향이 짙다. R사용자가 자료를 .csv로 보내달라고 하면, 귀찮아할 것이다.
보내온 엑셀파일을 여는 방법이 있다. R Commander에서도 기능을 제공한다. 그러나, 솔직히 불편하게 되어있는 점을 인정하지 않을 수 없다. Rstudio에서 'Import Dataset...' 기능을 사용하면, 쉽게 엑셀 자료를 R로 불러올 수 있기 때문이다. 엑셀자료를 불러오는데 걸림돌은 엑셀 시트의 내용이 구조화되어 있지 않거나, 또는 구조화되어 있어도 빈 공간들이 많은 경우이다.
여러개의 엑셀 파일 또는 시트에서 데이터셋을 많이 불러오는 경우가 아니라면, 적어도 단일 데이터셋을 불러오는 경우라면, '편법'을 이용할 수 있다. 마이크로소프트 오피스 또는 엑셀 프로그램을 갖고 있는 경우, 또는 유사한 스프레드시트를 갖고 있는 경우는 원하는 부분을 블록화할 수 있고, 또 복사와 붙이기가 가능하다. 줄여말하면, 클립보드 기능을 사용하면 R로 엑셀에서 데이터셋을 불러올 수 있다. 매우 손쉽다.
1. 엑셀 시트에서 R로 불러오고 싶은 부분을 마우스를 이용하여 선택(drag)하고, 복사한 다음에
데이터 > 데이터 불러오기 > Excel 파일로부터… Data > Import data > from EXCEL file...
Microsoft사의 Office 제품에 포함된 EXCEL은 광범위하게 사용되는 수치정보 관리 및 시각화 툴이다. 관리/재무 정보를 다루는 수많은 기업과 개인이 사용하기 때문에 R 사용자가 엑셀의 .xls, 또는 .xlsx 파일을 불러오는 요구는 매우 크다. 관심사가 크기 때문일까, R에서 EXCEL파일을 불러오기 위해서 개발자들이 만든 기여패키자들도 많다. R Commander에서 EXCEL파일을 불러오기 위하여 사용하는 외부 패키지도 변해왔다. 2019년 5월 현재는 readxl 이라는 패키지이다.
- EXCEL은 다른 통계분석툴과 달리 sheet 개념이 있다. 따라서 불러올 데이터의 객체화 과정에서 EXCEL 파일의 어느 sheet를 불러올 것인가를 선택할 수 있다. - EXCEL은 다른 통계분석툴과 달리 데이터 프레임화에 필요한 변수명에 대한 강한 규칙을 갖고 있지 않다. 따라서 R Commander의 기본 설정은 선택된 sheet의 첫 행의 정보를 변수 정보로 활용하는 것이다.
?readXL # RcmdrMisc 패키지의 readXL 도움말 보기
Rcmdr 2.7-x 의 한글 환경에서는 excel 파일을 불러오는데 오류가 발생한다. 아래의 문서를 참조할 수 있다.
'데이터 > 데이터 불러오기 > SPSS 데이터셋에서...' 메뉴 기능을 선택하자. 아래와 같은 화면이 등장한다.
- 데이터셋의 기본이름은 Dataset으로 되어있다. 원하는 (영문)이름으로 바꿀 수 있다.
- 기본설정으로 클릭되어 제공되는 선택사항이 '(문자 변수를 요인으로 변환하기(Convert character variables to factors)'이다. 문자형 변수를 요인형 변수로 바꾼다는 것이다. 문자형을 요인형으로 바꾸는 것이 필요한가? 필요하지 않은가? 이 질문은 R을 이해하는 데 있어서 중요하다. 필요할 수 도 있고, 불필요하고 오히려 분석에 거추장스러울 수 있다. 하지만, R Commander에서 제공하는 대부분의 기능은 문자형을 요인형으로 만들어 처리한다.
SPSS라는 인기있는 GUI 사회과학 통계분석툴이 있다. 70년대 초반부터 발전해온 전산 통계툴이기 때문에, 대부분의 학자들에게 무척 친숙하다. SPSS 경험자들이 R을 배울 때 어색한 개념이 factor이다. R의 데이터 유형(Type) 중 하나인 factor는 흔히 '범주형(categorical)' 으로 SPSS 사용자들이 이해하고 있기 때문이다. 아울러 factor하면 요인분석에서 등장하는 개념으로 바로 넘어가는 경우가 흔하다.
요인형으로 바꾸는 이유는 시각화 작업과도 연관성이 크다. R에서 시각화되는 정보는 수치형과 요인형이다. 수치형은 연속형 자료로, 요인형은 이산형 자료로 시각화되기 때문에, plot()로 호출되는 방식이 크게 다르다. 문자형을 요인형으로 바꾼다는 것은 곧 시각화 준비를 마쳤다는 의미이기도 하다.
?readSPSS # RcmdrMisc 패키지의 readSPSS 도움말 보기
Dataset <- readSPSS("/home/jhshin/다운로드/foreign/inst/files/electric.sav",
rownames=FALSE, stringsAsFactors=TRUE, tolower=FALSE)
# 로컬 저장소에 있는 electric.sav 파일 불러오기 사례
Data > Import data > from text file, clipboard, or URL...
개인적인 경험과 판단이지만, R에서 외부 데이터 파일을 불러오는 것을 초급자들은 너무 어려워한다. 쉽지 않다. 분석과 시각화 작업을 하기에 앞서서 자료 불러오기가 어려우니, 많은 사람이 쉬운 GUI 분석도구로 되돌아가려고 한다. read.table() 계열 함수가 어렵다.
R Commander는 이러한 불편함을 최소화하기 위하여 인자들을 쉽게 선정하도록 화면 구성이 되어있다. 하지만, 먼저 알아야할 것이 있다. R Commander에서 불러오는 객체, 다시말해 외부 데이터 파일로부터 불러올 대상은 반드시 데이터 프레임 형식을 취한다. 변수이름을 갖고, 엑셀과 같은 스프레드시트 형식으로 사례값들이 배열되어 있는 것만 GUI 메뉴로 작업할 수 있다. 만약, 데이터프레임 형식이 아니라면, 일반 콘솔 환경과 같은 조건에서 Command Line 작업을 해야한다.
- data set의 기본이름은 Dataset이다. 원하는 것으로 이름을 바꿀 수 있다. 가급적 영문을 추천한다. 행여 다른 시스템에서 파일이름의 호환문제를 겪을 수 있기 때문이다. (위의 메뉴 창에서는 Nations라고 데이터셋의 이름을 변경했다.)
- 결측치 표시는 NA가 기본설정이다.
- 외부 파일을 불러올지, 메모리(clipboard)에서 불러올지, 외부인터넷 경로에서 내려받을 지를 선택할 수 있다.
- 필드 구분자를 선택할 수 있다. 사실, 필드 구분자가 초급자에게는 어렵다. 빈 공백, commas, 세미 콜론, 탭 등이 사용되기 때문에 혼란스러울 수 있다. 일반적으로 .txt로 되어 있는 것은 빈 공백, .csv로 되어 있는 파일은 comman인 경우가 흔하다. 하지만, 정확한 내부 규칙이 없기 때문에 어려개를 번갈아 선택해봐야할 수 있다.
- Decimal-Point의 경우, 한국은 미국스타일의 Period[.]를 관행적으로 쓰기 때문에 기본설정을 따르면 된다.
Nations라는 이름으로 불러온 데이터셋이 활성화되어 R Commander 에서 활용할 수 있는 환경이 시작된다.
사례를 하나 소개한다. libreOffice Calc에서 엑셀파일을 불러오고, 또 이것의 첫 시트를 clipboard에 복사하고, R Commander로 불러온다고 생각해보자.
- Locatioin of Data File에서 Clipboard를 선택하고,
- Field Separator에서 Tabs(탭)을 선택해야 한다. 기본설정을 바꿔야한다는 뜻이다.
한가지 유의해야할 것은 변수이름이 바뀌는 규칙이 있다는 점이다.
- R에서는 괄호를 변수이름에 넣을 수 없다. 앞뒤 괄호는 ..으로 바뀐다. '연락처(대표)'는 '연락처.대표.'로 바뀐다.
데이터 파일이 (어떤 규칙성에 의하여 성공적으로) 불러와지면, 상단의 R 아이콘 옆에 Data set:에 파란 색의 객체이름이 보인다. 기본설정이라면 Dataset이 될 것이다.
?read.table # utils 패키지의 read.table 도움말 보기
## using count.fields to handle unknown maximum number of fields
## when fill = TRUE
test1 <- c(1:5, "6,7", "8,9,10")
tf <- tempfile()
writeLines(test1, tf)
read.csv(tf, fill = TRUE) # 1 column
ncol <- max(count.fields(tf, sep = ","))
read.csv(tf, fill = TRUE, header = FALSE,
col.names = paste0("V", seq_len(ncol)))
unlink(tf)
## "Inline" data set, using text=
## Notice that leading and trailing empty lines are auto-trimmed
read.table(header = TRUE, text = "
a b
1 2
3 4
")