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 / (ˌ)ā...

Drinking culture in Korea: Honsul (drinking alone) / 한국의 음주 문화: 혼술

Honsul (혼술, drinking alone) is a combination of two words, honja (혼자, alone) and sul-masigi (술 마시기, drinking). It has become a trendy and widely used word to describe how people have been drifting away from drinking with company since the 2010s. This trend is generally thought of as driven by the growing number of people in their 20s and 30s who are living alone. '혼술'은 '혼자'와 '술 마시기'의 합성어입니다. 이 단어는 사람들이 무리지어 음주를 하는 것을 기피하는 현상을 나타내는 단어로 2010년대 이후 유행하여 널리 쓰이게 되었습니다. 혼자 사는 20대, 30대 인구가 늘어나면서 이들이 이러한 문화를 주도하는 것으로 알려져 있습니다. Honsul at home (only two days ago) Honsul as a counter-reaction to hoe-sik 혼술, 회식 문화에 대한 반작용 Drinking alone never used to be common in Korea. Many people who were born in the 1960s and 70s are heavily group oriented. They highly value group activities and like to do everything "together." Members of their groups aren't allowed to say "no" to group activities. As they are now in key positions of companies, the...

토익 공부 안 하고 한 번에 985점 받은 후기/평소 영어 실력 키우기

공인 영어 시험 성적이 필요하지도 않았는데 작년에 수험료 할인 기회가 있어서 토익 시험을 보았다. 공인 영어 시험은 약 8년만이었다. 토익 점수가 영어 실력과 비례한다고는 생각하지 않는다. 문제풀이 스킬에 의존해서 실제 실력에 비해 고득점을 받을 수도 있고, 점수만 높고 말하기가 전혀 안 되는 사람들도 있다. 하지만 반대로 평소 영어 실력이 좋다면 학원 도움 없이 어렵지 않게 고득점을 받을 수 있을 수 있을 것이라 생각한다. 나는 1년 정도 일상에서 영어와 친해지려고 노력했고 내 실력 변화가 궁금했다. 내 평소 실력을 확인하고 싶어서 문제 유형 확인을 위한 모의고사 1회만 풀어보고 토익 시험에 응시했다. (파트별 문제집이나 학원의 도움을 받지 않았다.) 나는 30대 중반의 직장인이다. 직장에서는 그닥 영어를 쓸 일이 없다. 이제까지 해외여행을 제외하고 외국에 살아 본 적이 없다. 최근 10년간은 영어 학원에 다닌 적이 없다. +고등학교 시절 1학년때 한 8개월, 3학년 때 2개월 정도 영어 학원에 다녔다. 과외는 받아본 적이 없다. 대학생 때(텝스 990이 만점이던 시절) 텝스 공부를 혼자서 해본 적이있다. 신입생 때 교내 모의 토익을 한 번, 8년전에 취업 서류 제출때문에 공인 토익 시험을 한 번 봤다. 다만, 시험을 보기 전에 1년 정도는 영어와 친해지려고 노력했다. 영어를 시험 과목이나 자격증이 필요한 분야보다는 그저 언어로 생각하며 지냈다. 특별한 목표 설정 없이 그저 일상에서 영어를 많이 사용하려고 했는데 자세한 이야기는 뒤에서 하려고 한다. 985 점이 나왔다. 세상에, 나도 놀랐다. Listening part는 사실 안 들리는 부분은 거의 없었다. 다만 내가 영어 시험이란걸 본 지가 오래 되어서 그런지 '와 요새는 보기가 이런식으로 나와?' 하다가 다음 문제를 못 듣고 당황해서 찍은게 몇 개 있었는데 거기서 틀린 것 같다. 아직 운전하며 우리말 라디오 방송 듣듯이 편하...