R에서 데이터를 불러오고 내보내는 방법을 알아보자. 데이터를 불러오는 명령어야 아무거나 가져다 쓰면 되지만 알고보면 여기에도 고려할 사항이 조금 있다. 데이터를 잘못 불러와서 나중에 고생하거나 혹은 에러가 났는데 고칠 방법을 모르게 되면 난처하다. 따라서 그저 아무거나 따라서 쓰기보다는 데이터 불러오기 과정에서 어떤 문제가 발생할 수 있는지, 어떤 방법으로 불러오는 것이 나은지 알아두면 좋다. Base 함수와 package readr을 이용한 데이터 불러오기와 내보내기를 알아보자.
(한줄요약: base 함수보다는 package readr의 read_csv(), write_csv()를 추천한다.)
잘못된 정보가 있으면 댓글로 알려주시면 감사하겠습니다.
의학 논문 작성을 위한 R 기초
2. R에서 데이터 불러오고 내보내기
2.1. csv파일로 저장하기 (.xls to .csv)
많은 경우에 자료를 엑셀 파일 형태로 가지고 있다. 이를 그대로 R에서 불러올 수도 있지만 (e.g., package readxl), 여러 sheet를 포함한 경우에 sheet를 지정해줘야 하기도 하고 가끔 데이터를 불러왔을 때 에러가 나거나 원본과 다르게 되엉킨 경우도 있어서 가급적 csv파일 형태로 변환한 뒤 불러오는 것을 권한다.
엑셀 파일은 단순히 '다른이름으로 저장하기'를 통해 .csv로 저장할 수 있으나 다음 몇 가지 사항에 주의해야 한다.
엑셀 파일은 단순히 '다른이름으로 저장하기'를 통해 .csv로 저장할 수 있으나 다음 몇 가지 사항에 주의해야 한다.
- 변수명이나 값에 한글이 들어가 있으면 문제가 생길 수 있다.
- 변수명(첫 행)에는 띄어쓰기를 사용하지 말고 알파벳, 숫자, -, _를 혼용해서 사용하자.
- csv로 저장하게 되면 multi-sheet중에 하나만 저장되게 되므로 주의하자.
꼭 한글이 필요하다면, 엑셀에서 다른 이름으로 저장 -> 파일이름 설정하는 팝업에서 '도구' -> 웹 옵션 -> 인코딩 -> UTF-8로 설정한 뒤 저장한다.
그래도 해결이 안 되는 경우가 있는데, 그런 경우는 .csv 파일을 .txt로 바꾼 뒤 메모장에서 열어서 다른 이름으로 저장 -> 인코딩 -> UTF-8로 다시 저장한 뒤 파일명을 .csv로 바꿔준다.
그래도 해결이 안 되는 경우가 있는데, 그런 경우는 .csv 파일을 .txt로 바꾼 뒤 메모장에서 열어서 다른 이름으로 저장 -> 인코딩 -> UTF-8로 다시 저장한 뒤 파일명을 .csv로 바꿔준다.
2.2. 데이터 불러오기: read.csv
R에서 csv파일을 불러오는 기본 명령어(base 함수)는 read.csv()이다. 다음과 같이 파일 경로와 함께 사용한다. 파일 위치 폴더구분에 윈도에서 사용하는 '\' 기호를 쓸 경우는 두개씩 써줘야 하고, 그렇게 하지 않으려면 /을 쓰면 된다.
example <- read.csv("c:/R/R_document/iris.csv")
example <- read.csv("c:\\R\\R_document\\iris.csv")
head(example, 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
#example <- read.csv("c:\R\R_document\iris.csv") 이렇게 쓰면 안 된다.
read.csv() 내부에 arguments 설정을 통해 옵션을 변화시킬 수 있다.
example <- read.csv("c:/R/R_document/iris.csv", header = FALSE)
#원본 파일의 첫 행을 변수명으로 처리하지 않는다.
#원본 파일의 첫 행에 변수명이 존재하지 않고, 불러들인 다음 따로 변수명을 설정해줄 것이라면 이 옵션을 써야 한다.
head(example, 3)
## V1 V2 V3 V4 V5
## 1 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 2 5.1 3.5 1.4 0.2 setosa
## 3 4.9 3 1.4 0.2 setosa
기본 옵션으로 불러들인 경우 데이터 값에는 문제가 없지만 이따금 문자열(character)로 된 값들이 factor라는 형식으로 저장이 되는 경우가 있다. 추후 데이터 가공을 할 때에 문제가 생길 소지가 있으므로 문자열은 문자열 그대로 불러들이는 것이 좋다. 다음 옵션을 사용한다.
example <- read.csv("c:/R/R_document/iris.csv", stringsAsFactors = FALSE)
하지만 read.csv보다는 package readr의 read_csv를 사용할 것을 추천한다. 이유는 아래에 설명하였다.
2.3. 데이터 불러오기: read_csv (package readr)
Package readr의 함수들(e.g., read_csv)에 대해 다음과 같은 사실이 알려져있다. (출처: R for Data Science, Hadley Wickham & Garrett Grolemund)
- 일반적으로 베이스 함수보다 훨씬 더(~10배) 빠르다.
- 결과값을 data frame이 아닌 tibble*로 저장하며 character vector를 factor형으로 변환하지도, 불필요하게 행 이름을 사용하거나 열 이름을 변경하지도 않는다. 베이스 R 함수는 변환, 변경하기 때문에 불편하다.
- 좀 더 재현 가능하다. 베이스 R 함수는 운영체제 및 환경 변수의 일부 동작을 상속하므로 자신의 컴퓨터에서 작동하는 불러오기 코드가 다른 사람의 컴퓨터에서 작동하지 않을 수 있다.
*tibble은 data frame과 비슷하지만 좀 더 발전된 형태인 것으로 알아두면 된다. 대용량의 데이터를 다룰 때 좀 더 편리한 것으로 알고 있다.
read_csv를 사용하기 위해 package readr을 설치한다.
install.packages("readr")
read_csv()의 사용법은 다음과 같다.
library(readr) #먼저 package readr을 불러와야 한다.
example <- read_csv("c:/R/R_document/iris.csv")
알아둘 만한 추가 arguments는 다음과 같다.
example <- read_csv("c:/R/R_document/iris.csv", col_names = FALSE)
#read.csv의 header = FALSE와 대응
head(example, 3)
## # A tibble: 3 x 5
## X1 X2 X3 X4 X5
## <chr> <chr> <chr> <chr> <chr>
## 1 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 2 5.1 3.5 1.4 0.2 setosa
## 3 4.9 3 1.4 0.2 setosa
example <- read_csv("c:/R/R_document/iris.csv", skip = 1)
#원본 데이터에서 1행을 빼고 불러들인다. 2행이 column name으로 불러들여짐.
head(example, 3)
## # A tibble: 3 x 5
## `5.1` `3.5` `1.4` `0.2` setosa
## <dbl> <dbl> <dbl> <dbl> <chr>
## 1 4.9 3 1.4 0.2 setosa
## 2 4.7 3.2 1.3 0.2 setosa
## 3 4.6 3.1 1.5 0.2 setosa
example <- read_csv("c:/R/R_document/iris.csv", skip = 1, col_names = FALSE)
#원본 데이터에서 1행을 불러들이지만 2행을 column name으로 불러들이지는 않음.
head(example, 3)
## # A tibble: 3 x 5
## X1 X2 X3 X4 X5
## <dbl> <dbl> <dbl> <dbl> <chr>
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
2.4. 데이터 내보내기: write.csv
사실 앞서 이용한 iris.csv는 R 내부 데이터셋인 iris를 csv로 저장해둔 것이다. write.csv의 사용법은 다음과 같다.
data(iris) #내장 데이터인 iris를 가져온다. iris라는 data frame으로 import된다.
write.csv(iris, "c:/R/R_document/iris_test.csv")
#write.csv(저장할 data frame 이름, "경로와 파일명")
iris_test <- read.csv("c:/R/R_document/iris_test.csv", stringsAsFactors = FALSE)
head(iris_test, 3)
## X Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 1 5.1 3.5 1.4 0.2 setosa
## 2 2 4.9 3.0 1.4 0.2 setosa
## 3 3 4.7 3.2 1.3 0.2 setosa
불필요하게 iris 데이터의 행 번호가 별도의 column으로 저장되어있는 것을 알 수 있다. 따라서 다음과 같은 옵션을 넣어준다.
data(iris)
write.csv(iris, "c:/R/R_document/iris_test.csv", row.names = FALSE)
#행 이름(여기서는 번호)을 따로 저장하지 않는다.
#저장한 것을 다시 불러와 확인해보자.
iris_test <- read.csv("c:/R/R_document/iris_test.csv", stringsAsFactors = FALSE)
head(iris_test, 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
2.5. 데이터 내보내기: write_csv (package readr)
write_csv는 앞서 별도의 옵션으로 걸어주었던 것이 default로 되어있어서 조금 더 간단하게 (그리고 빠르게) 사용 가능하다.
library(readr)
data(iris)
write_csv(iris, "c:/R/R_document/iris_test2.csv")
iris_test2 <- read_csv("c:/R/R_document/iris_test2.csv")
head(iris_test2, 3)
## # A tibble: 3 x 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <dbl> <dbl> <dbl> <dbl> <chr>
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
Comments
Post a Comment