R4CR

Day1 - tidyverse | 2023-09-01
Jinhwan Kim

Overview

Clinical Research

  1. 연구의 중요 특징: 재현가능성
    • 같은 데이터 + 같은 프로세스 -> 같은 결과
  2. 프로세스(코드)의 가독성도 중요함
    • 데이터에 어떤 작업을 하여 이러한 결과가 나왔다
  3. 프로그래밍은 A에 B를 해라 의 모음으로 볼 수 있음
    • 반복을 위해 함수를 만들어 작업하기도 함
  4. tidyverse는 이러한 잘 만들어진 데이터 관련 작업들
    • 통계 분석. 연구, 데이터 과학분야에서 많은 활용

tidyverse packages

  • 불러오기: DBI, haven, httr, readxl, googlesheets4, rvest, jsonlite, xml2, readr
  • 변환: tidyr, dplyr, dbplyr, dtplyr, data.table, stringr, forcats, lubridate, hms, blob
  • 공통: magrittr, glue, tibble
  • 모델링: tidymodels
  • 시각화: ggplot2
  • 공유: quarto, rmarkdown, shiny
  • 기타: feather, purrr

magrittr

The Treachery of Images

  • This is not Pipe

  • 르네 마그리트 (René Magritte)

  • Pipe Operator %>%, |>

    • Operator: +, -, *, /
  • |>(native pipe)는 magrittr 없이도 R 4.1 이상에서 사용 가능. 아직은 %>%|>에 비해 조금 더 다양한 기능 지원

Pipe

data <- read_data('FILE') # Not work
trans_data <- transform_data(data)
graph <- make_image(trans_data)
result <- make_ppt(graph)

result <- "FILE" %>% # Not work
  read_data() %>%
  transform_data() %>%
  make_image() %>%
  make_ppt()
  • 전부 동일한 결과
library(magrittr)
print("Hello World")

"Hello World" %>% 
  print()

"Hello World" %>%
  print

Pipe (2)

  1. %>% 는 코드의 마지막에 위치해야 함
  2. 함수에 여러 개의 입력이 필요한 경우, 맨 앞의 입력값만 사용
"Hello World" # 실행
%>% print() # ERROR

"Hello World" %>% # 이어서 
  print() # 실행
ex <- read.csv('https://github.com/zarathucorp/R4CR-content/raw/main/example_g1e.csv')
head(x = ex, n = 3)
ex %>% # x로 사용
  head(n = 3)
  EXMD_BZ_YYYY RN_INDI HME_YYYYMM Q_PHX_DX_STK Q_PHX_DX_HTDZ Q_PHX_DX_HTN
1         2009  562083     200909            0             0            1
2         2009  334536     200911            0             0            0
3         2009  911867     200903            0             0            0
4         2009  183321     200908           NA            NA           NA
  Q_PHX_DX_DM Q_PHX_DX_DLD Q_PHX_DX_PTB Q_HBV_AG Q_SMK_YN Q_DRK_FRQ_V09N HGHT
1           0            0           NA        3        1              0  144
2           0            0           NA        2        1              0  162
3           0            0           NA        3        1              0  163
4          NA           NA           NA        3        1              0  152
  WGHT WSTC BMI VA_LT VA_RT BP_SYS BP_DIA URN_PROT HGB FBS TOT_CHOL  TG HDL LDL
1   61   90  29     1     1    120     80        1  13 117      264 128  60 179
2   51   63  19     1     1    120     80        1  14  96      169  92  70  80
3   65   82  25     1     1    130     80        1  15 118      216 132  55 134
4   51   70  22     1     1    101     62        1  13  90      199 100  65 114
  CRTN SGOT SGPT GGT GFR
1    1   25   20  25  59
2    1   18   15  28  74
3    1   26   30  30  79
4    1   18   14  11  61

Pipe (실습)

  • ex에서 EXMD_BZ_YYYY2010인 데이터만 선택
  • subset 함수 사용
    EXMD_BZ_YYYY RN_INDI HME_YYYYMM Q_PHX_DX_STK Q_PHX_DX_HTDZ Q_PHX_DX_HTN
215         2010  383603     201012           NA            NA           NA
216         2010  326432     201012           NA            NA           NA
217         2010  915731     201005           NA            NA           NA
218         2010  793017     201006           NA            NA           NA
    Q_PHX_DX_DM Q_PHX_DX_DLD Q_PHX_DX_PTB Q_HBV_AG Q_SMK_YN Q_DRK_FRQ_V09N HGHT
215          NA           NA           NA        3        1              0  172
216          NA           NA           NA        2        1              0  160
217          NA           NA           NA        3        1              0  170
218          NA           NA           NA        2        1              0  156
    WGHT WSTC BMI VA_LT VA_RT BP_SYS BP_DIA URN_PROT HGB FBS TOT_CHOL  TG HDL
215   58   68  20     2     2    126     78        1  13  98      254  47  77
216   54   69  21     1     1    120     80        1  13 100      226  94  70
217   63   83  22     2     1    140     90        1  15  94      150  76  69
218   53   69  22     1     1    128     83        1  11 100      150 114  43
    LDL CRTN SGOT SGPT GGT GFR
215 167    1   27   27  36  NA
216 137    1   21   17  10  NA
217  65    1   16   19  43  NA
218  84    1   19   22  38  NA
ex %>% 
  subset(EXMD_BZ_YYYY == 2010) %>%
  head(4)

Pipe (실습2)

  • ex에서 EXMD_BZ_YYYY2010, GGT20 이상인 데이터만 선택
    EXMD_BZ_YYYY RN_INDI HME_YYYYMM Q_PHX_DX_STK Q_PHX_DX_HTDZ Q_PHX_DX_HTN
215         2010  383603     201012           NA            NA           NA
217         2010  915731     201005           NA            NA           NA
218         2010  793017     201006           NA            NA           NA
227         2010  752655     201001           NA            NA           NA
    Q_PHX_DX_DM Q_PHX_DX_DLD Q_PHX_DX_PTB Q_HBV_AG Q_SMK_YN Q_DRK_FRQ_V09N HGHT
215          NA           NA           NA        3        1              0  172
217          NA           NA           NA        3        1              0  170
218          NA           NA           NA        2        1              0  156
227          NA           NA           NA        3        1              0  166
    WGHT WSTC BMI VA_LT VA_RT BP_SYS BP_DIA URN_PROT HGB FBS TOT_CHOL  TG HDL
215   58   68  20     2     2    126     78        1  13  98      254  47  77
217   63   83  22     2     1    140     90        1  15  94      150  76  69
218   53   69  22     1     1    128     83        1  11 100      150 114  43
227   76   86  28     2    10    120     80        1  15  91      148 150  68
    LDL CRTN SGOT SGPT GGT GFR
215 167    1   27   27  36  NA
217  65    1   16   19  43  NA
218  84    1   19   22  38  NA
227  50    1   31   39  33  NA
ex %>% 
  subset(
    EXMD_BZ_YYYY == 2010 &
      GGT >= 20
  ) %>%
  head(4)

# SAME
ex %>% 
  subset(EXMD_BZ_YYYY == 2010) %>%
  subset(GGT >= 20) %>%
  head(4)

Pipe (실습3)

  • ex에서 Q_PHX_DX_HTN1인 데이터만 선택
  • 이후 TOT_CHOL ~ HGB회귀분석 수행한 다음
  • 이후 Coeffieicnts 출력
  • lm 함수 사용
(Intercept)         HGB 
   172.9083      1.5375 
ex %>% 
  subset(Q_PHX_DX_HTN == 1) %>%  
  lm(TOT_CHOL ~ HGB, data = .) %>%
  .$coefficients %>% 
  print()

Pipe (실습4)

  • ex에서 Q_SMK_YN별로 모든 변수들의 평균을 계산
  • aggregate 함수 사용
  Q_SMK_YN EXMD_BZ_YYYY  RN_INDI HME_YYYYMM Q_PHX_DX_STK Q_PHX_DX_HTDZ
1        1       2013.5 467320.3   201358.6            0             0
2        2       2013.5 482871.8   201357.0            0             0
3        3       2013.5 516423.4   201356.9            0             0
  Q_PHX_DX_HTN Q_PHX_DX_DM Q_PHX_DX_DLD Q_PHX_DX_PTB Q_HBV_AG Q_DRK_FRQ_V09N
1          0.2         0.0          0.0            0      2.2            0.6
2          0.2         0.1          0.1            0      2.1            1.4
3          0.1         0.0          0.0            0      2.3            1.8
   HGHT WGHT WSTC  BMI VA_LT VA_RT BP_SYS BP_DIA URN_PROT  HGB  FBS TOT_CHOL
1 161.9 62.6 78.7 23.8   1.0   1.0  121.0   75.7      1.1 13.7 96.6    195.6
2 169.8 70.8 84.5 24.6   1.1   1.1  124.7   78.7      1.1 15.0 99.8    193.0
3 172.4 72.8 84.1 24.5   1.2   1.2  122.3   76.8      1.1 15.5 96.5    196.7
     TG  HDL   LDL CRTN SGOT SGPT  GGT  GFR
1 114.4 57.3 115.8    1 23.6 22.1 27.6 90.0
2 157.1 50.8 112.4    1 27.3 29.4 42.3 86.7
3 167.7 51.6 120.5    1 25.4 28.9 48.4 93.3
ex %>% 
  aggregate(
    data = ., # . = 이전 것 (iris)
    . ~ Q_SMK_YN, # . = 모든 변수
    FUN = function(x){ mean = mean(x) %>% round(1) }
  )

Pipe Exercise

  • 이전 시간 (R기초)에서 다뤘던 코드를 pipe를 이용해서 바꿔보자

HINT: sutset(select = EXMD_BZ_YYYY) 사용

## Subset
ex1 <- ex
ex1.2012 <- ex1[ex1$EXMD_BZ_YYYY >= 2012, ]
ex1.2012 <- subset(ex1, EXMD_BZ_YYYY >= 2012) ## subset

### GOAL
table(ex1.2012$EXMD_BZ_YYYY)

Pipe Exercise

## Subset with Pipe

ex %>%
  subset(EXMD_BZ_YYYY >= 2012) %>%
  subset(select = EXMD_BZ_YYYY) %>%
  table()

Pipe를 사용하는 것으로

  • ex1.2012, ex1 사용 X
  • 데이터는 처음한번만 사용 (ex)
  • 연속적인 코드를 indent로 구분 가능
## Subset

ex1 <- ex
ex1.2012 <- ex1[ex1$EXMD_BZ_YYYY >= 2012, ]
ex1.2012 <- subset(ex1, EXMD_BZ_YYYY >= 2012) 
table(ex1.2012$EXMD_BZ_YYYY)

정리

  • magrittr는 코드의 가독성을 위한 Pipe operator, %>%를 쓸 수 있게 하는 패키지

  • PipeFunctional Programming, Tidyverse에서의 핵심

  • 프로그래밍 퍼포먼스의 관점에서 %T>%, %$%, %<>%, %!>%등 다양한 Pipe도 있지만 몰라도 무방

  • 더 자세한 내용은 Introducing magrittr 아티클 참조