본문 바로가기
2. 데이터/1) 데이터 불러오기

R에서 엑셀(xls,xlsx)파일 불러오는 방법, read_excel()

by makhimh 2020. 1. 22.
반응형

R에서 엑셀(xls,xlsx)파일 불러오는 방법, read_excel()


엑셀파일(xls, xlsx)을 R에서 불러오려면 readxl 패키지를 설치해야합니다. 먼저 패키지를 설치합시다. 


> install.packages("readxl")


엑셀파일을 하나 만들어봅시다. 




저장한 엑셀파일의 경로는 아래와 같습니다.


"C:/Users/Public"


먼저 working directory를 위 경로로 바꿔야합니다. 아래와 같은 코드를 실행합니다. 


> setwd("C:/Users/Public")


먼저 패키지를 불러옵니다. 


> library(readxl)


이제 엑셀파일을 불러옵시다. read.table함수를 사용합니다. 다양한 옵션이 있지만 일단은 옵션 지정 없이 불러오겠습니다. 


> mydata=read_excel("myex.xlsx")


아래와 같이 잘 불러와졌습니다. 자료구조는 tibble입니다. 


> mydata

# A tibble: 4 x 2

    `1`  `10`

  <dbl> <dbl>

1     2    20

2     3    30

3     4    40

4     5    50


저는 dataframe으로 바꿔서 사용합니다. as.data.frame 함수를 사용합니다. 


> mydata=as.data.frame(read_excel("myex.xlsx"))

> mydata

  1 10

1 2 20

2 3 30

3 4 40

4 5 50


문제는 첫줄이 자동으로 header로 들어갑니다. 이때는 col_names 옵션을 설정하여 해결해줍니다. 열의 이름을 지정해주면 첫줄이 header로 들어가지 않습니다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2")))

> mydata

  c1 c2

1  1 10

2  2 20

3  3 30

4  4 40

5  5 50




이제 read_excel 함수의 옵션을 살펴봅시다. 확장자가 특정된 read_xls와 read_xlsx함수도 있지만 더 일반적인 read_excel함수를 설명하겠습니다. 


read_excel(

  path,

  sheet = NULL,

  range = NULL,

  col_names = TRUE,

  col_types = NULL,

  na = "",

  trim_ws = TRUE,

  skip = 0,

  n_max = Inf,

  guess_max = min(1000, n_max),

  progress = readxl_progress(),

  .name_repair = "unique"

)


path옵션 불러올 엑셀파일의 경로를 입력합니다. 


sheet옵션 특정 sheet를 불러올 때 사용합니다. 아래와 같이 sheet를 하나 추가하였다고 합시다.



아래와 같이 sheet의 순서를 입력해도 되고, sheet 이름을 입력해도 됩니다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet=2))

> mydata

  c1 c2

1  a  e

2  b  f

3  c  g

4  d  h


sheet 이름을 입력해보겠습니다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet="Sheet2"))

> mydata

  c1 c2

1  a  e

2  b  f

3  c  g

4  d  h


range옵션은 불러올 셀의 영역을 선택해줍니다. 아래 그림을 봅시다.



이 영역만 불러와봅시다.


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet="Sheet2",range="A1:B2"))

> mydata

  c1 c2

1  a  e

2  b  f


col_names옵션은 열의 이름을 지정합니다. 


col_types옵션 열의 자료형을 지정합니다. 열의 수 만큼 입력해야하고, 그렇지 않은 경우는 입력한 값이 반복되어 자동입력됩니다. 자료형의 종류는 다음과 같습니다. "skip", "guess", "logical", "numeric", "date", "text" or "list". 



위 그림의 sheet1을 불러옵시다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet="Sheet1",col_types=c("text","numeric")))

> str(mydata)

'data.frame': 5 obs. of  2 variables:

 $ c1: chr  "1" "2" "3" "4" ...

 $ c2: num  10 20 30 40 50


skip타입은 어떤역할을 할까요? 해당 열을 불러오지 않습니다.


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet="Sheet1",col_types=c("text","skip")))

> mydata

  c1

1  1

2  2

3  3

4  4

5  5


na옵션은 무엇을 NA로 인식할지 결정합니다. 디폴트는 "" 인데 빈 셀을 NA로 인식한다는 의미입니다. 아래와 같이 


NA가 포함된 엑셀을 만들어봅시다. 



불러옵시다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet="Sheet1"))

> mydata

  c1 c2

1  1 10

2 NA 20

3  3 NA

4  4 40

5  5 50


na의 디폴트는 NA라고 입력했는데도 NA로 인식했네요? 어떻게된걸까요. str 함수를 사용하면 NA로 인식한게 아니라 문자형으로 인식한 것임을 알 수 있습니다. 


> str(mydata)

'data.frame': 5 obs. of  2 variables:

 $ c1: chr  "1" "NA" "3" "4" ...

 $ c2: chr  "10" "20" "NA" "40" ...


NA를 인식하게 하려면 아래와 같이 옵션을 설정해야 합니다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet="Sheet1",na="NA"))

> str(mydata)

'data.frame': 5 obs. of  2 variables:

 $ c1: num  1 NA 3 4 5

 $ c2: num  10 20 NA 40 50


trim.ws 옵션은 문자 앞에 띄어쓰기와 같은 whitespace가 있는 경우 이를 trim(잘라내기)할지 여부를 결정합니다. 


아래 그림을 봅시다.



b 앞에 띄어쓰기가 되어있습니다. 불러와봅시다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet="Sheet2"))

> str(mydata)

'data.frame': 4 obs. of  2 variables:

 $ c1: chr  "a" "b" "c" "d"

 $ c2: chr  "e" "f" "g" "h"


띄어쓰기가 사라져있습니다. trim.ws가 TRUE인게 디폴트라서 그렇습니다. FALSE로 바꿔봅시다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet="Sheet2",trim_ws=FALSE))

> str(mydata)

'data.frame': 4 obs. of  2 variables:

 $ c1: chr  "a" "   b" "c" "d"

 $ c2: chr  "e" "f" "g" "h"


띄어쓰기가 그대로 있습니다. 


skip옵션은 처음 몇번째 줄까지 건너뛸지를 결정합니다. 아래와 같은 메모장이 있다고 합시다.



두번째줄까지 건너띄고, 세번째 줄부터 가져와봅시다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("c1","c2"),sheet="Sheet1",skip=2))

> mydata

  c1 c2

1  3 30

2  4 40

3  5 50


n_max옵션은 최대 몇번째 줄까지 가져올지 결정합니다. 


guess_max옵션는 열의 타입을 guess하는데 몇번째 줄까지 반영할지를 결정합니다. 


.name_repair옵션은 입력된 열이름이 형식에 맞지 않을 경우 자동으로 수정해주는 옵션입니다. 


> mydata=as.data.frame(read_excel("myex.xlsx",col_names=c("1","c2"),sheet="Sheet1",.name_repair="universal"))

New names:

* `1` -> ...1

> mydata

  ...1 c2

1    1 10

2    2 20

3    3 30

4    4 40

5    5 50


반응형

댓글