Skip to main content

R 기초, 데이터 불러오고 내보내기

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로 저장할 수 있으나 다음 몇 가지 사항에 주의해야 한다.
  1. 변수명이나 값에 한글이 들어가 있으면 문제가 생길 수 있다.
  2. 변수명(첫 행)에는 띄어쓰기를 사용하지 말고 알파벳, 숫자, -, _를 혼용해서 사용하자.
  3. csv로 저장하게 되면 multi-sheet중에 하나만 저장되게 되므로 주의하자.
꼭 한글이 필요하다면, 엑셀에서 다른 이름으로 저장 -> 파일이름 설정하는 팝업에서 '도구' -> 웹 옵션 -> 인코딩 -> UTF-8로 설정한 뒤 저장한다.

그래도 해결이 안 되는 경우가 있는데, 그런 경우는 .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)
  1. 일반적으로 베이스 함수보다 훨씬 더(~10배) 빠르다.
  2. 결과값을 data frame이 아닌 tibble*로 저장하며 character vector를 factor형으로 변환하지도, 불필요하게 행 이름을 사용하거나 열 이름을 변경하지도 않는다. 베이스 R 함수는 변환, 변경하기 때문에 불편하다.
  3. 좀 더 재현 가능하다. 베이스 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

Popular posts from this blog

잘못 발음하기 쉬운 의학 용어 영어 단어 모음 (계속 업데이트)

의학 용어 영단어들은 대개 다 영어라서 한글로 바꾸기도 어렵고, 우리말로 바꿔놓은 텍스트를 읽노라면 원서를 읽는 것보다 머리가 더 지끈거릴 때도 있다. 하지만 원서는 그저 눈으로 읽을 뿐이다. 결국 발음은 제각각 다들 개성넘치게 하고 수업시간에도 웬만해서는 제대로 된 발음을 배울 수가 없다. 그렇게 의대 본과 4년, 인턴과 레지던트 5년 합쳐 9년 동안 굳어진 잘못된 발음을 이후에도 계속 쓰는게 일반적이다. 이왕 하는 영어 공부 내 전공에도 접목시켜보자. 매번 마음속으로 갸우뚱하며 자신없이 발음했던 의학 용어들을 머릿속에 떠오르는 대로 검색해 목록을 만들었다. 앞으로 발음이 헷갈리는 다른 의학 용어가 생길 때마다 바로 사전을 찾아보든지 유튜브를 찾아보고 정리해놓을 예정이다. 작심삼일이 되지 않기를 바랄 뿐이다. (마지막 업데이트 2020. 5. 27.) 단어 / Pronunciation symbols (Merriam-Webster dictionary) Anatomy-related pulmonary /  ˈpu̇l-mə-ˌner-ē / ㅓ와ㅜ의 중간느낌? 퍼ㅜㄹ머네리 *Cambridge [ˈpʊl.mə.ner.i], Oxford [|pʌlməneri], Collins  [pʌlməneri] mediastinum / mē-dē-ə-ˈstī-nəm / 메디아스티넘 아니고 미디어스타이넘 endocrine / ˈen-də-krən  , -ˌkrīn, -ˌkrēn / 엔도크라인 아니고 엔도크런, 엔도크린 aorta /  ā-ˈȯr-tə / 아올타 아니고 에이올더 atrium / ˈā-trē-əm / 아트리움 아니고 에이트리엄 myocardium / mī-ə-ˈkär-dē-əm / 마이오카ㄹ디엄 branchial / ˈbraŋ-kē-əl / 브랜키-얼 bronchial / ˈbräŋ-kē-əl / 브란키-얼 bronchiole / ˈbräŋ-kē-ˌōl / 브란키-오울 azygos / (ˌ)ā...

타임지 1년 구독해서 영어 공부해보고 공부방법과 장단점 정리해봅니다.

때는 2018년 여름. 영어공부 겸 취미 겸 간간히 New York Times와 TIME지를 사서 읽고 있었다. 사실 국내 뉴스도 신문도 잘 안 보는데 NYT와 TIME이 재미가 있겠느냐...마는 재미가 있었다! 몸은 비록 한국에 있으나, 세계인(Cosmopolitan)이 된 기분이랄까. 물론 슬프고 처참한 내용의 기사들이 많아서 마음아프긴 했지만 다른 나라 사람들과 잠시나마 같은 걱정을 하고 우리나라를 넘어 세계를, 지구를 걱정하며 그릇이 커지는 느낌이었다. (걱정도 같이 커진게 흠...) 어쨌든 그렇게 재미가 붙어서 자꾸 사다 보니 구매에 들이는 노력과 비용을 줄이고 싶었다. TIME지는 주간지 (Weekly Magazine)이고 NYT는 물론 매일 나온다. 둘 다 대형 서점에서 구할 수 있다. (NYT를 영풍문고에서 취급했던 것 같은데 기억이 잘 나지 않는다.) TIME지는 단권이 아마 8,000원 정도 했고 NYT는 훨씬 쌌던 것 같다. 읽을거리 대비 가격도 신문인 New York Times가 더 싸긴 하다. 하지만 차근차근히 읽다보면 대략 일주일은 읽게 되는데, 신문은 종이재질이 좋지 않고 가독성이 떨어지는데다 TIME지 내용이 은근히 깊이있고 (덕분에 더 어려웠지만) 재미있어서 결국 구독하게 되었다. 할인행사로 한거라 80주 정도를 30만원 정도에 구독하게 되었는데 문제는 아직 80주가 안 지났다. 대략 10개월 정도는 TIME를 비교적 꼭꼭 씹어먹었고 그 이후는 TIME지와 내가 원하는 공부방법과 괴리가 좀 생겨서 방 구석에 쌓아두기만 하고 있다. (10개월이면 대충 40주니까.. 매주 정가로 사서 공부한셈 칠 수 있을 것 같다;; 자기합리화;;) 어쨌든 개인적으로 TIME지를 이용해서 영어공부를 해본 후기. 우선 내가 공부한 방법 1. 기사는 내가 호기심 가는 순서로 읽는다. (무조건 순서대로 보다가는 질려서 TIME지 자체가 질려버릴 수 있어서) 2. 사전 찾아보지 않고 읽는다. 3. 잘 모르는 단어는 형광펜 표시 (그 중에...

인스타그램으로 영어공부를 한다고? 인스타그램에서 즐겁게 영어연습하다 배운 것들.

내가 인스타그램으로 영어를 공부하게 된 이유. 어느날 그런 생각이 들었다. 나는 생각이 많고 (기회가 주어지면) 말도 많은데 이걸 그냥 한글 대신 영어로 표현하는 연습을 하면 유창성이라도 조금 늘지 않을까? 이미 알고 있는 문법적 지식이나 단어는 꽤 되는데 '활용 능력'이 떨어지는게 평균적인 영어교육을 받은 한국인들의 특징이고 나도 그렇다. 구슬이 서 말이라도 꿰어야 보배인데 꿰어본 적이 없어서 말하고 쓰는 능력이 늘지를 않는다. 죽이 되든 밥이 되든 이미 내가 가지고 있는 것을을 잘 조합해서 영어로 표현하는 연습을 하면 좋겠다는 생각이 들었고 이것을 평소 내재된 표현욕구로 추진력을 얻어 Instagram에 영어로 글을 올림으로써 해소하면 일석이조라는 결론에 이르렀다. 익명 공개계정으로 하면 그 누가 영어 못한다고 핀잔을 주겠는가? (비록 인스타그램 안에서만이지만) 외국인 친구가 생길 수도 있지 않나. 발영어라도 괜찮아. 그리고 본격적으로 글을 쓰기 시작했다. 영어 공부한다는 느낌보다는, 친구들과 소통 창구였던 비공개 실명계정에서 늘 그랬던 대로 소박한 주제의 글들을 영어로 쓸 뿐이었다. 말하고 싶은 것이 있을 때마다 영어로 정리해서 인스타그램에 글을 쓰는 버릇을 들이다 보니 확실히 쓰기 실력이 상승했다. 비록 원어민이 보면 엉망일 문장일지언정 기본 어휘로 여기저기 활용하는 능력이 생겼다. 남들이 이 글을 본다고 생각하니 문법을 신경쓰게되고, 이미 올린 뒤에도 틀린 부분이 발견되면 계속 고쳐나갔다. 이 과정에서 내가 썼던 글도 내가 반복해서 보게 되고 영작에 시간이 조금 덜 걸리게 되고 결과적으로 영어를 연습해보자는 소기의 목적을 달성하였다. 영어로 소통하기 처음에는 그저 랜덤하게 지나가는 사람들이 좋아요를 눌러줄 뿐이었는데 그중 외국인들이 말을 거는 경우도 있었다. 해 본 사람은 알겠지만 발영어라도 소통이 가능할 때의 희열이란! 하지만 먼저 댓글을 달아주는 경우는 매우 드물었고 그래서 나는 아예 내가 인스타그램 친구를 찾...