[R] 파일 읽기 & 쓰기

DongGyu Jung·2021년 10월 2일
0

R은 통계분석 최적화 언어이기 때문에
외부에서 데이터셋(Data Set) 파일을 불러와 작업하는 경우가 대부분이다.
데이터의 종류는 물론 확장자도 다양하여
하고 있는 분석 작업에 최적화시켜 읽어들이는 것이 매우 중요하다.

다양한 자료구조와 확장자들이 존재하지만
이번 게시물에선
별도의 라이브러리(Library)가 아닌 R 내장함수이면서
가장 흔히 쓰이는 확장자 파일을 불러오는 함수를 알아볼 것이다.

우선 기본적으로 어떤 파일이든
현재 Working Directory를 파악하고
불러올 데이터를 끌어올 수 있게끔 Path설정을 정확히 해야한다.

R에서의 경로 설정 및 이동 함수는 다음과 같다.

#현재 작업 위치 조회
getwd()

#희망 경로 설정 및 이동
setwd()

이 후, 코드에서는 위 작업환경 설정 함수은 생략하고
임의로 데이터 위치는 C:/Test 라고 설정하겠다.

❗ 참고로 윈도우 탐색기를 통해 주소를 복사해 온 경우,
붙여넣기하면 "일반 슬래시 (/)"가 아닌 "역슬래시(\)"로 입력이 되는데 그대로 실행시킨다면 인식을 하지 못한다.
일일이 일반 슬래시로 변경을 해주거나 붙여넣기된 역슬래시에 역슬래시를 하나씩 더 입력해주면 된다.


⭕ TXT파일 / LOG파일

물론 CSV파일도 메모장을 통해 확인할 수 있지만
TXT 확장자 파일과 LOG 확장자 파일은 대표적인 메모장으로 확인할 수 있는 데이터라고 할 수 있는데 LOG파일에 대해서는 이 글에서는 자세히 설명하지 않겠다.

중요한 것은 일정한 구조를 가진 문자열 데이터일 경우 (table형식이 아닌 txt파일 제외)와
Data Frame 형태의 Table 구조 txt데이터에 있어
가장 유용하게 쓸 수 있는 함수 3가지 정도만 간략하게 설명하려 한다.

읽기 ( read.table / scan / readLines )

1. read.table

우선,
"공백 이나 탭(Tab) 으로 구분하는 .txt 정형데이터"는
read.table()을 사용하는 것이 편리하다.

해당 함수에서 주의해야 할 점은 header 인수인데
밑에서 설명하겠지만 "첫 행의 값을 Column name으로 설정한 것인지" 에 대한 설정을 담당하는 인수이다.
(.log 확장자 파일을 읽을 때 유용하다.)

허나 read.table()에서는 기본 값(Default)F로 첫 행을 "데이터 값"으로 읽어들이기 때문에
첫 행을 Column 제목으로 설정하고 싶을 땐 header=T 값을 주어야 한다.

click_log <- read.table("C:/Test/click.log", stringsAsFactors = T)

2. scan

이 함수는 "숫자"만 있는 파일에 특화되어 있는 함수인데
독특하게도 숫자데이터를 벡터(vector)로 읽어들인다.

그렇다고 문자열 데이터를 못 읽지는 않는다.
"String데이터가 있을 경우" 혹은 "한 줄(Line)이 아닌 단어(Word) 단위" 로 읽을 땐,
what 인수를 통해 NULL값을 변환 처리할 값을 지정해 주고
encoding 인수를 통해 적합한 인코딩 형식 지정을 꼭 해주어야 한다. (영어를 제외한 문자열 깨짐)

nums <- scan("C:/Test/sample_num.txt")

Read 7 items
[1]  10  30  40 100  20  40  70


words_utf8 <- scan("C:/Test/sample_utf8.txt", what="",encoding="UTF-8")

Read 6 items
[1] "aaa"    "가나다" "123"    "bbb"    "ccc"    "ddd" 


words_utf8_new <- scan("C:/Test/sample_utf8.txt", what="")#data 깨짐

[1] "aaa"                  "媛\u0080<eb>굹<eb>떎" "123"                  "bbb"                  "ccc"                 
[6] "ddd"

3. readLines

readLines() 함수는 이름 그대로 "행 단위"로 읽는 것에 특화되어 있다.


#참고로 ANSI 코드 형식의 파일은 encoding 인수를 지정해줄 필요없이 인식 가능하다.
lines_ansi <- readLines("data/sample_ansi.txt")
[1] "aaa 가나다 123" "bbb ccc ddd"   

lines_utf8 <- readLines("data/sample_utf8.txt",encoding="UTF-8")
[1] "aaa 가나다 123" "bbb ccc ddd"   

lines <- readLines("data/sample_utf8.txt")
[1] "aaa 媛\u0080<eb>굹<eb>떎 123" "bbb ccc ddd"   

⭕ CSV파일

CSV (Comma-Separated Values) 파일은
이름 그래도 콤마(,)로 열(Column)을 구분한 파일이다.

1) 읽기

함수명은 read.csv() 이다.

키워드 가변 인수는 정말 다양하고 수가 많지만
흔히 많이 쓰이는 매개변수만 소개하는 점 양해바란다.

대표적 인수로는 header 변수가 있는데
이는 "첫 행의 값을 Column name으로 설정한 것인지" 에 대한 설정이다.
(기본 값 : T / 미설정한다면 '첫 행을 열 제목'으로 받아들인다 )

또 다른 인수로는
encoding 변수가 있다.
이는 "해당 파일의 인코딩방식을 설정" 하는 변수이다.
예상외로 해당 변수 미설정으로 오류 발생이 쉬우니 보통 안전하게
매번 encoding="utf-8" 을 설정한다.
(입력할 때 uft-8, UTF-8 두 가지 경우 모두 작동하니 작성하기 편한 방식으로 입력하면 된다. _ 다른 인코딩 방식들도 동일함 )

a_csv <- read.csv("C:\\Test\\a.csv")
#첫 행을 유효 데이터로
b_csv <- read.csv("C:\\Test\\b.csv", header=T)
# UTF-8 형식으로 인코딩하여 읽기
c_csv <- read.csv("C:\\Test\\c.csv", encoding="UTF-8")

<그 외 다른 키워드 가변 인수>
(이 인수들은 다른 전처리 함수들에서도 흔하게 출현하니 알아두는 것이 좋다.)

  • quote : 데이터가 대사 혹 평가와 관련된 데이터로 모두 "" 등의 인용부호로 이루어져 있을 때 사용된 인용부호를 기입하여 부호를 삭제 후, 읽어들인다.

  • sep : 혹여 구분자가 쉼표 가 아닌 다른 구분자가 쓰였을 때, 어떤 구분자가 쓰였는지 작성

  • na.strings=c() : 결측값(NA)처리 설정, 결측값이 될 대상들의 값을 벡터로 지정하면 읽어들일 때, 해당 값들은 R에서의 NA값으로 처리되게끔 변환해준다.

  • stringAsFactor : 만약 읽어오는 데이터에 Factor의 성질을 가진 문자열들 Factor형으로 변환하고 각 level로 구분하여 읽어들인다.

  • col.names : 읽어들일 데이터셋의 열 제목을 미리 지정해준다.

  • row.names : 읽어들일 데이터셋의 행 제목을 미리 지정해준다.


2) 쓰기

함수명은 write.csv() 이다.
정말 단순하기 그지 없다. (정말 좋은 의미다..❤)

Read와 Write.... 외울 필요도 없을 정도로 직관적인 함수이다.
어쨋든
저장 함수이기 때문에 필요한 인수는 read.csv()에 비해 많다.

우선,
필수 인수로
첫 번째인수는 당연히 csv파일로 저장할 데이터 명이다.
두 번째인수는 Path 설정인데 현재 디렉토리에 해당 데이터를 저장하고 싶다면 별도의 경로 없이 "(저장명).csv"를 작성하면 된다.

변수로는 row.names 가 있다.
이 변수는 "저장 대상 데이터셋의 행 제목/행 번호(Row Name)을 그대로 저장할 것인지" 결정하는 것이다.
(기본 값 : T / 미설정한다면 저장되는 데이터 각 행의 앞에 행 이름이 저장된다. )

## 임의로 iris를 csv 파일로 저장해보자.
csv_iris <- iris

# 현재 Working Directory에 같이 저장
write.csv(csv_iris, "a_iris.csv")
# 파일 경로 지정
write.csv(csv_iris, "C:\\Test\\a_iris.csv")
# 행 번호 제외
write.csv(csv_iris, "C:\\Test\\a_iris.csv", row.names = F)

<그 외 다른 키워드 가변 인수>
(이 인수들은 다른 전처리 함수들에서도 흔하게 출현하니 알아두는 것이 좋다.)

위에서 언급했던 인수들 중에서도 쓰이는 인수들이 몇 가지 있으니 사용할 때, 적용해보는 것을 추천한다.

  • na : 저장할 데이터의 결측값을 어떤 값으로 변환하여 저장할 것인지 지정한다.
    (보통 "" 공백으로 지정한다.)

  • fileEncoding : 파일 데이터 인코딩 설정 (read()함수에서의 encoding과 같은 성능)



⭕ Excel 파일

Excel 파일은 위 CSV 파일의 경우와는 다르게
추가적인 패키지 설치가 필요하다.
패키지명은 'xlsx'이다.

install.packages('xlsx')
library(xlsx)

Excel 파일을 저장하고 싶을 땐, 위 과정을 수행한 뒤 진행해야 한다.

추가적으로
특히 encoding 설정을 필수적으로 하여
혹여나 발생할 오류들을 최소화하는 것이 좋다.

1) 읽기

함수명은 read.xlsx() 이다.

위 과정 외에는
앞서 살펴본 CSV파일 읽기/쓰기 함수들과 구조가 매우 유사하다.
대부분의 구조와 인수는 read.csv함수와 동일하다 생각하면 되고

Excel파일의 특징일 수 있는 Excel 통합 문서Sheet 기능과 관련된 인수를 확인해 보자.
인수명은 단순하게 sheet이고
읽어올 데이터가 있는 '시트의 Index 값/이름 ' 을 작성하면 된다.
Sheet Index값 으로 호출하는 것은 sheetIndex 로 사용해도 무방하다.

# encoding 인수 값을 설정하지 않은 것은 바람직하지 못하다.
a_excel <- read.xlsx("C:\\Test\\a.xlsx")

# 첫 행을 유효 데이터로
b_excel <- read.xlsx("C:\\Test\\b.xlsx", header=T)

# UTF-8 형식으로 인코딩하여 읽기
c_excel <- read.xlsx("C:\\Test\\c.xlsx", encoding="UTF-8")

# 통합문서에서 특정 Sheet 지정
d_excel <- read.xlsx("C:\\Test\\d.xlsx", sheetIndex = 1, encoding="UTF-8")

2) 쓰기

함수명은 write.xlsx() 이다.

해당 함수 또한 ! 구조가 csv와 굉장히 유사하니 짧게 짚고 넘어가겠다.

우선 "write.csv() " 와 동일하게,
첫 번째인수는 당연히 excel파일로 저장할 데이터 명이고
두 번째인수는 Path 설정이다.
이 또한, 현재 디렉토리에 해당 데이터를 저장하고 싶다면 별도의 경로 없이 "(저장명).xlsx"를 작성하면 된다.

## 임의로 iris를 csv 파일로 저장해보자.
excel_iris <- iris

# 현재 Working Directory에 같이 저장
write.xlsx(excel_iris, "a_iris.xlsx")
# 파일 경로 지정
write.xlsx(excel_iris, "C:\\Test\\a_iris.xlsx")
# 행 번호 제외
write.xlsx(excel_iris, "C:\\Test\\b_iris.xlsx", row.names = F)

0개의 댓글