프로그래밍 /R

[R] 데이터 읽어오기(read) & 데이터 기록하기(write)

yooj_lee 2019. 6. 20. 21:57
300x250

데이터 읽어오기는 이전에도 글 작성을 했지만,

구분자가 명확하지 않은 경우 readLines를 통해 미리 확인을 하는 절차를 추가하여 작성함.

- Encoding

1. OS별 인코딩 (운영체제별 인코딩 방식이 다름)

Mac OS, Linux: UTF-8

Windows: Euc-kr, cp949

 

2. 스크립트 파일 문제 해결 (한글이 깨진 파일 어떻게 복구할 것인가?)

1) 기본 인코딩 설정 변경하여 애초에 깨질 일을 없게 하자^^!

Reopen with Encoding —> UTF-8로 기본 설정값 변경.

 

** 파일 인코딩이 뭐길래 깨지나?

한글, 유니코드 처리할 때의 방식이 UTF-8, cp949 등등 다 다름.

Ex) 종이접기

펭귄모양으로 접은 종이를 다시 원상복구 시키기 위해서는 접었던 순서의 역순으로 펼쳐야함. 그러나, 펭귄모양으로 접은 종이를 창문 모양으로 접은 종이를 펼칠 때와 같은 방식으로 펼친다면 종이가 찢어질 것.

인코딩도 똑같. 한글을 UTF-8 방식으로 변환해놓은 것을 윈도우에서 읽으려고 cp949 방식으로 다시 재변환시키려고 하면 글자가 깨지거나, 자모가 분리될 수밖에 없음.

 

2) Encoding() 함수

Encoding(x) <- value

x: vector, value: encoding 방식

 

- Data Reading

1. 데이터 입력

: 다양한 확장자의 파일을 읽어오는 방법, 각 확장자마다 어떤 함수를 이용해 데이터를 읽어오고 결과가 어떤지?

Ex) csv

readLines(filename, n = nrow) # n: 읽어들일 행의 개수

data_csv = read.csv(filename)

 

Ex)tsv

data_tsv_1 = readLines(filename, n = nrow)

data_tsv_2 = read.delim(filename)

 

** readLines를 사용하는 이유는 해당 파일의 확장자를 모를 경우나 불분명한 경우 샘플로 몇 줄만 뽑아서 구분자를 파악한 후 이에 맞는 함수를 적용하여 데이터를 읽어오기 위해서이다.

 

Ex) XML

library(“XML”)

data_xml = xmlTreeParse(filename)

data_xml = xmlRoot(data_xml)

data_xml = xmlSApply(data_xml, function(x){xmlSApply(x, xmlvalue)})

*SApply: for문 없이 어떤 동작을 수행하려고 사용하는 함수

 

Ex) HTML table

library(“XML”)

data_html = readHTMLTable(filename)

 

 

Ex) json (시스템 로그를 파싱할 때, 즉 시스템 로그를 특수문자 다 빼고 내가 원하는 형태로 처리를 할 때)

library(‘jsonlite’)

data_json = fromJSON(txt = filename)

 

 

Ex) custom_format: 사람이 작성한 글을 보다 정확히 파싱하기 위해서 custom format으로 파일을 저장함.

 

data_custom_1 = readLines(filename, n = nrow) # 구분자가 무엇인지 모르기때문에 readLines를 통해 일부분을 읽어와서 구분자 확인

data_custom_2 = read.delim(filename, sep)

data_custom_3 = read.csv(filename, sep)

 

 

Ex) xlsx (excel file)

library(‘readxl’)

data_xl = read_xlsx(filename)

 

cf.) cSplit(indt, splitCols, sep = ‘,’)

; the cSplit functin is designed to quickly and conveniently split concatenated data into separate values.

 

 

- Data Writing (데이터 기록)

1. csv

write.csv(object, file, row.names = FALSE, fileEncoding)

*row.names = FALSE 는 거의 고정으로 생각. 파라미터 이름은 생략 가능

 

2. tsv

write.table(object, file, sep, row.names = FALSE)

 

3. Custom Format

write.table(object, file, sep, row.names = FALSE)

sep 인자에는 사용자가 지정한 구분자를 전달

 

4. json : write_json 명령어

json file의 경우는 column 이름을 모든 행마다 다 저장하기 때문에(모든 딕셔너리에 column name이 다 명시되어있다고 생각) column의 길이가 긴 경우 용량이 지나치게 커진다는 단점이 있다.

 

5. xlsx

library(‘excel.link’)

xl.save.file(r.obj = object, filename, row.names = FALSE)

 

 

Cf) working directory

1) getwd(): check the current working directory

2) setwd(path): Change the working directory to the path

300x250