본문 바로가기

R

데이터프레임 불러오기 5 - 엑셀 파일

아마 대부분의 직장인들은 엑셀이 손에 익었을 것이다. 일상 업무에서 자주 접하는 파일도 엑셀 파일일 확률이 높다. 간단한 데이터 변환 작업을 하기에는 엑셀이 편하기도 하니, 엑셀을 다시 R로 불러들일 상황이 자주 발생한다.  따라서 엑셀 파일을 불러오거나 엑셀로 변환시키는 방법은 필수적으로 알고 있어야 한다.

write.xlsx() 함수로 엑셀파일 만들기

일단 예제로 사용할 엑셀 파일을 만들어 보겠다. 이를 위해서는 "xlsx" 패키지의 'write.xlsx()' 함수가 필요하다. CSV 파일 불러오기를 통해 만들었던 'Lahman' 패키지의 People이라는 데이터프레임을 엑셀 파일로 만들어 보자.  기억이 나지 않는다면 다음 링크의 글을 다시 확인해 보자. 

https://double-d.tistory.com/27

 

R: 데이터프레임 불러오기 1 - CSV파일, R기본 데이터세트

오랜만에 이전 포스팅에 가 보았다. (https://double-d.tistory.com/18) 데이터베이스 예제로 Sean Lahman의 Baseball Database를 소개한 글이었다. 링크로 남겨두었던 웹사이트에 가보니 연결이 되지 않는다. 구

double-d.tistory.com

 

#install.packages("xlsx")
library(xlsx)

xlsx::write.xlsx(People, "data\core\People.xlsx",
				col.names = TRUE)

앞으로도 자주 보겠지만, 대부분의 블로그나 책에서는 install.package() 함수를 생략하거나 위와 같이 주석처리 한다. 파일을 설치한다는 것은 사용자의 컴퓨터에 변화를 준다는 것이기 때문에 전적으로 사용하는 사람의 의사에 따라야 한다. 따라서 처음 배우는 사람들이 아무 생각 없이 무작정 복사하고 붙여넣기한 후에 실행시켜 버리는 것을 막는 의미가 있다. 이는 특히 나중에 다룰 RMarkdown에서 더 잘 지켜져야 한다. 

 

read_excel() 함수로 엑셀파일 불러오기

앞에서 만들어 놓은 "People.xlsx"를 불러오자. 우선 'readxl' 패키지를 설치하고, read_excel() 함수를 사용한다. 참고로 read_ecxel()함수는 .xlsx, .xlsm, .xltx, .xltm 파일들에 사용할 수 있다. 만약 오래된 버전의 엑셀로 만든. xls 파일이 있다면, read_xls() 함수를 사용해야 한다. 사용하는 방법은 기본적으로 같다. 

#install.packages("readxl")
library(readxl)

read_excel("data\core\People.xlsx")

 

'read_excel()' 함수를 더 알아보기 위해, Help에서 'Usage'를 확인해보자. 

?read_excel

 

Argument로 있는 것들에 대해서 쓸만한 것들을 위주로 우선 설명해 보겠다.

 

특정 sheet만 불러오기

엑셀은 sheet가 여러 개인 경우도 있다. 그 중에서 특정 sheet만 사용하려면 아래와 같이 'sheet ='을 넣어주면 된다. 

read_excel(
  readxl_example("datasets.xlsx"),
  sheet = "chickwts"
)

위에 sheet 예제를 보여주기 위해서 갑자기 readxl_example()함수를 사용하였다. readxl_example() 함수는 샘플 데이터세트를 불러와 준다.

 

readxl_example() 함수로 예제 데이터세트 불러오기

'Lahman' 패키지를 통해서 예제 데이터프레임을 만들기 귀찮다면, 다른 방법이 있다. CSV파일을 다룰 때처럼, readxl 패키지도 샘플 엑셀 파일을 제공한다. 어떤 엑셀 파일이 있는지 확인하려면 함수명인 'readxl_example()'만 실행하면 된다. 그중에서 "datasets.xlsx"만 가져오고 싶다면 아래와 같은 조금 복잡한 과정을 거친다. 

  • 'readxl_example()' 함수는 샘플 데이터세트의 경로값을 가져온다.
  • 'lapply()' 함수를 통해 해당 경로의 값을 입력받을 함수를 지정해서 실행한다. 이 경우 read_excel()함수이다. 

 

readxl_example()

path <- readxl_example("datasets.xlsx")
example_datasets <- lapply(excel_sheets(path), read_excel, path = path)

 

위와 같이 하면, 'path'에 어떤 값이 들어가 있을지 확인해 보자. path를 실행시켜 보면 아래와 같이 파일의 경로가 character 값으로 들어와 있는 것을 볼 수 있다. 

> path
[1] "/Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library/readxl/extdata/datasets.xls"

'example_datsets'에는 어떤 값이 들어왔을까? 아래와 같이 4개의 데이터프레임을 갖는 리스트가 들어가 있음을 확인할 수 있다.

> example_datasets
[[1]]
# A tibble: 150 × 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 
 4          4.6         3.1          1.5         0.2 setosa 
 5          5           3.6          1.4         0.2 setosa 
 6          5.4         3.9          1.7         0.4 setosa 
 7          4.6         3.4          1.4         0.3 setosa 
 8          5           3.4          1.5         0.2 setosa 
 9          4.4         2.9          1.4         0.2 setosa 
10          4.9         3.1          1.5         0.1 setosa 
# ℹ 140 more rows
# ℹ Use `print(n = ...)` to see more rows

[[2]]
# A tibble: 32 × 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# ℹ 22 more rows
# ℹ Use `print(n = ...)` to see more rows

[[3]]
# A tibble: 71 × 2
   weight feed     
    <dbl> <chr>    
 1    179 horsebean
 2    160 horsebean
 3    136 horsebean
 4    227 horsebean
 5    217 horsebean
 6    168 horsebean
 7    108 horsebean
 8    124 horsebean
 9    143 horsebean
10    140 horsebean
# ℹ 61 more rows
# ℹ Use `print(n = ...)` to see more rows

[[4]]
# A tibble: 1,000 × 5
     lat  long depth   mag stations
   <dbl> <dbl> <dbl> <dbl>    <dbl>
 1 -20.4  182.   562   4.8       41
 2 -20.6  181.   650   4.2       15
 3 -26    184.    42   5.4       43
 4 -18.0  182.   626   4.1       19
 5 -20.4  182.   649   4         11
 6 -19.7  184.   195   4         12
 7 -11.7  166.    82   4.8       43
 8 -28.1  182.   194   4.4       15
 9 -28.7  182.   211   4.7       35
10 -17.5  180.   622   4.3       19
# ℹ 990 more rows
# ℹ Use `print(n = ...)` to see more rows

Sean Lahman Baseball Database 설명 글에서 언급했던 것과 같이, 리스트에 들어가 잇는 데이터프레임에서 특정 데이터프레임만 선택하려면 아래와 같이 하면 된다. 아래의 예시는 리스트에 들어가 있는 첫 번째 데이터프레임만 'iris'에 저장한다. 

iris <- example_datasets[1]

 

이 밖에 range 를 통해서 한 sheet 안에서도 특정  영역만 선택해서 넣는 방법도 있긴 한데, 보통 그냥 다 불러들인 다음에 slice()나 filter()를 사용해서 선택하는 일이 많다. readxl 패키지에 대해서 더 자세히 알고 싶다면 아래의 R Cran readxl패키지 공식 문서를 확인하자. 

https://cran.r-project.org/web/packages/readxl/readxl.pdf