학습 목표

1. 리스트 살펴보기 1

함수형 프로그래밍을 통해 다양한 *apply 계열 혹은 map 계열 함수를 적용시키기 전에 데이터가 리스트인 경우 리스트를 살펴보는 것이 필요하다.

이런 문제에 봉착하는 것은 당연하다. 예를 들어 회귀분석 결과 산출되는 lm() 함수 산출물 내부를 이런 관점으로 본적이 있는가? 혹은 API가 대충 되어 있는 웹사이트에서 데이터를 긁어 온 경우, 추가 데이터 분석을 위해 데이터 내부를 까보고 이를 바탕으로 자료분석이 가능한 형태로 변형해야 된다.

1.1. str() 함수

str() 함수가 언제가 가장 먼저 생각할 수 있는 것인데, 리스트 객체를 넣어 데이터구조를 파악하는 것이 데이터프레임을 넣는 경우와 비교해도 그다지 결과물 해석이 쉽지 않다. 예를 들어 공간정보 데이터 .shp 파일을 R로 불러들일 경우 이를 str 명령어로 들여다 보면 그 이유를 알 수 있다.

이런 문제점에 대한 해법으로 max.level, list.len 인자를 str() 함수에 넣어 구조를 살펴보고, 필요한 내용을 찾아내서 [, [[ 꺾쇠괄호를 사용해서 뽑아내는 방식이 동원된다: str(..., list.len = x, max.level = y)[[1]]

1.2. 리스트 데이터

repurrrsive 팩키지에 예제 리스트 데이터가 담겨있다.

  • wesanderson : 색상 팔레트 데이터 (리스트 자료형)
  • Game of Thrones : 왕좌의 게임 캐릭터 데이터 (리스트 자료형)
  • GitHub: GitHub 사용자와 저장소 데이터 (리스트 자료형)

2. listviewer 팩키지 활용 살펴보기

인터랙티브 위젯을 활용하여 리스트 자료형을 살펴보면 도움이 많이 된다. listviewer::jsonedit(got_chars, mode = "view") 와 같이 명령어를 넣어 리스트 자료형을 갖는 왕좌의 게임에 등장하는 캐릭터를 살펴볼 수 있다.

2.1. 환경설정

리스트 예제 데이터는 devtools::install_github("jennybc/repurrrsive") 명령어를 통해 왕좌의 게임을 포함한 데이터를 불러들인다. 인터랙티브 위젯기능을 활용하여 리스트 데이터를 살펴보기 위해서 listviewer 팩키지를 설치해야만 되는데, reactR 팩키지가 사전에 설치되어야 하는 의존성이 있어 함께 설치한다.

library(purrr)
library(repurrrsive) # devtools::install_github("jennybc/repurrrsive")
library(listviewer) # devtools::install_github('timelyportfolio/reactR')

2.2. 리스트 자료형 살펴보기

리스트형으로 된 색상 팔레트 데이터 (wesanderson), 왕좌의 게임 캐릭터 데이터 (Game of Thrones), GitHub 사용자와 저장소 데이터 (gh_users) 각각을 전통적인 str 명령어와 listviewer 팩키지 jsonedit 명령어와 함께 살펴본다.

# 1. 리스트 살펴보기 ----------------------------------------------------
# 1.1. wesanderson 리스트 뷰어

str(wesanderson)
#> List of 15
#>  $ GrandBudapest : chr [1:4] "#F1BB7B" "#FD6467" "#5B1A18" "#D67236"
#>  $ Moonrise1     : chr [1:4] "#F3DF6C" "#CEAB07" "#D5D5D3" "#24281A"
#>  $ Royal1        : chr [1:4] "#899DA4" "#C93312" "#FAEFD1" "#DC863B"
#>  $ Moonrise2     : chr [1:4] "#798E87" "#C27D38" "#CCC591" "#29211F"
#>  $ Cavalcanti    : chr [1:5] "#D8B70A" "#02401B" "#A2A475" "#81A88D" ...
#>  $ Royal2        : chr [1:5] "#9A8822" "#F5CDB4" "#F8AFA8" "#FDDDA0" ...
#>  $ GrandBudapest2: chr [1:4] "#E6A0C4" "#C6CDF7" "#D8A499" "#7294D4"
#>  $ Moonrise3     : chr [1:5] "#85D4E3" "#F4B5BD" "#9C964A" "#CDC08C" ...
#>  $ Chevalier     : chr [1:4] "#446455" "#FDD262" "#D3DDDC" "#C7B19C"
#>  $ Zissou        : chr [1:5] "#3B9AB2" "#78B7C5" "#EBCC2A" "#E1AF00" ...
#>  $ FantasticFox  : chr [1:5] "#DD8D29" "#E2D200" "#46ACC8" "#E58601" ...
#>  $ Darjeeling    : chr [1:5] "#FF0000" "#00A08A" "#F2AD00" "#F98400" ...
#>  $ Rushmore      : chr [1:5] "#E1BD6D" "#EABE94" "#0B775E" "#35274A" ...
#>  $ BottleRocket  : chr [1:7] "#A42820" "#5F5647" "#9B110E" "#3F5151" ...
#>  $ Darjeeling2   : chr [1:5] "#ECCBAE" "#046C9A" "#D69C4E" "#ABDDDE" ...
jsonedit(wesanderson, mode = "view", elementId = "wesanderson")

# 1.2. Game of Thrones 캐릭터 리스트 뷰어
str(got_chars, list.len = 3)
#> List of 29
#>  $ :List of 18
#>   ..$ url        : chr "http://www.anapioficeandfire.com/api/characters/1022"
#>   ..$ id         : int 1022
#>   ..$ name       : chr "Theon Greyjoy"
#>   .. [list output truncated]
#>  $ :List of 18
#>   ..$ url        : chr "http://www.anapioficeandfire.com/api/characters/1052"
#>   ..$ id         : int 1052
#>   ..$ name       : chr "Tyrion Lannister"
#>   .. [list output truncated]
#>  $ :List of 18
#>   ..$ url        : chr "http://www.anapioficeandfire.com/api/characters/1074"
#>   ..$ id         : int 1074
#>   ..$ name       : chr "Victarion Greyjoy"
#>   .. [list output truncated]
#>   [list output truncated]
str(got_chars[[1]], list.len = 8)
#> List of 18
#>  $ url        : chr "http://www.anapioficeandfire.com/api/characters/1022"
#>  $ id         : int 1022
#>  $ name       : chr "Theon Greyjoy"
#>  $ gender     : chr "Male"
#>  $ culture    : chr "Ironborn"
#>  $ born       : chr "In 278 AC or 279 AC, at Pyke"
#>  $ died       : chr ""
#>  $ alive      : logi TRUE
#>   [list output truncated]

jsonedit(number_unnamed(got_chars), mode = "view", elementId = "got_chars")

# 1.3. GitHub 사용자 리스트 뷰어
str(gh_users, max.level = 1)
#> List of 6
#>  $ :List of 30
#>  $ :List of 30
#>  $ :List of 30
#>  $ :List of 30
#>  $ :List of 30
#>  $ :List of 30
jsonedit(number_unnamed(gh_users), mode = "view", elementId = "gh_users")

  1. Explore the example lists: Wes Anderson, Game of Thrones, GitHub