바이오 대표

[R - 기본기] "dplyr" 을 이용한 Data transformation 본문

R

[R - 기본기] "dplyr" 을 이용한 Data transformation

바이오 대표 2023. 1. 10. 08:33

요약: 

  1. filter( )
  2. arrange( ) - order 바꿔줌
  3. select( ) - pick variables (columns) by names
  4. mutate( ) - create new variables, existing variables 이용
  5. summarize( )

** group_by( ) 로 중복 사용 가능

 

 

예시 데이터 

library(nycflights13)
library(tidyverse)

flights
#> # A tibble: 336,776 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # … with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

Terms

variables = columns

observations = rows

values = each 값

 

 

5.4 Select columns with select( )

큰 데이터 셋을 column names 를 이용하여 빠르게 subset 하고 싶을 때 사용 가능하다.

Select( ) 기본

select(data, name_1, name_2) # name 은 column name 을 뜻한다.

# Select columns by name
select(flights, year, month, day)
#> # A tibble: 336,776 x 3
#>    year month   day
#>   <int> <int> <int>
#> 1  2013     1     1
#> 2  2013     1     1
#> 3  2013     1     1
#> 4  2013     1     1
#> 5  2013     1     1
#> 6  2013     1     1
#> # … with 336,770 more rows

# year부터 day까지의 모든 columns select
select(flights, year:day)

# 특정 부분 제외하고 select
select(flights, -(year:day))

** errors **

  1. unable to find an inherited method for function ‘select’ for signature ‘"tbl_df"’
  2. → select( ) 대신 dplyr:: select( )로 직접 불러와준다.

rename( ), everything( )

rename(data, original_name = “new_name”): column 이름 변경 가능하다.

select(data, name_1, name_2, everything( )): 원하는 columns을 앞쪽에 위치 시키고 나머지 보이게 가능하다.

select(flights, time_hour, air_time, everything())
#> # A tibble: 336,776 x 19
#>   time_hour           air_time  year month   day dep_time sched_dep_time
#>   <dttm>                 <dbl> <int> <int> <int>    <int>          <int>
#> 1 2013-01-01 05:00:00      227  2013     1     1      517            515
#> 2 2013-01-01 05:00:00      227  2013     1     1      533            529
#> 3 2013-01-01 05:00:00      160  2013     1     1      542            540
#> 4 2013-01-01 05:00:00      183  2013     1     1      544            545
#> 5 2013-01-01 06:00:00      116  2013     1     1      554            600
#> 6 2013-01-01 05:00:00      150  2013     1     1      554            558
#> # … with 336,770 more rows, and 12 more variables: dep_delay <dbl>,
#> #   arr_time <int>, sched_arr_time <int>, arr_delay <dbl>, carrier <chr>,
#> #   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, distance <dbl>,
#> #   hour <dbl>, minute <dbl>

Columns을 뽑아 낼 때, 적용 가능한 functions:

starts_with(" "): “ ”로 시작하는 names

ends_with(" "): “ ” 로 끝나는 names

contains(" "): “ “ 포함

any_of( ): character들을 만들어서 사용가능 ex) vars <- c("year", "month”), select(d, any_of(vars)

matches(" "): regular expression을 이용한다. #대/소문자 상관 없음 ex) “(.)\\1”

num_range("x", 1:3): matches x1, x2 and x3.

** regular expression https://r4ds.had.co.nz/strings.html#matching-patterns-with-regular-expressions

# contains 를 사용한 예시
select(flights, contains("dep"))
# # A tibble: 336,776 × 3
#    dep_time sched_dep_time dep_delay
#       <int>          <int>     <dbl>
#  1      517            515         2
#  2      533            529         4
#  3      542            540         2
#  4      544            545        -1
#  5      554            600        -6
#  6      554            558        -4
#  7      555            600        -5
#  8      557            600        -3
#  9      557            600        -3
# 10      558            600        -2
# # … with 336,766 more rows
# # ℹ Use `print(n = ...)` to see more rows

짬뽕 역시 가능하다

flights_sml <- dplyr::select(flights, 
  year:day, 
  ends_with("delay"), 
  distance, 
  air_time
)
# # A tibble: 336,776 × 7
#     year month   day dep_delay arr_delay distance air_time
#    <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl>
#  1  2013     1     1         2        11     1400      227
#  2  2013     1     1         4        20     1416      227
#  3  2013     1     1         2        33     1089      160
#  4  2013     1     1        -1       -18     1576      183
#  5  2013     1     1        -6       -25      762      116
#  6  2013     1     1        -4        12      719      150
#  7  2013     1     1        -5        19     1065      158
#  8  2013     1     1        -3       -14      229       53
#  9  2013     1     1        -3        -8      944      140
# 10  2013     1     1        -2         8      733      138
# # … with 336,766 more rows
# # ℹ Use `print(n = ...)` to see more rows

 

 

5.5 Add new variable with mutate( )

Dateset의 끝에 새로운 column 추가를 위해 사용된다.

mutate( ) 기본

mutate(data, new_name1 = function1, new_name2 = function2)

transmute( data, new_name1 = , new_name2 = ) : 새로 만든 variables(columns) 만 keep 가능하다.

mutate(flights_sml,
  gain = dep_delay - arr_delay,
  speed = distance / air_time * 60
)
#> # A tibble: 336,776 x 9
#>    year month   day dep_delay arr_delay distance air_time  gain speed
#>   <int> <int> <int>     <dbl>     <dbl>    <dbl>    <dbl> <dbl> <dbl>
#> 1  2013     1     1         2        11     1400      227    -9  370.
#> 2  2013     1     1         4        20     1416      227   -16  374.
#> 3  2013     1     1         2        33     1089      160   -31  408.
#> 4  2013     1     1        -1       -18     1576      183    17  517.
#> 5  2013     1     1        -6       -25      762      116    19  394.
#> 6  2013     1     1        -4        12      719      150   -16  288.
#> # … with 336,770 more rows
# mutate() 안에서 variables(columns)을 만들었으면 그 또한 사용 가능하다.
mutate(flights_sml,
  gain = dep_delay - arr_delay,
  hours = air_time / 60,
  gain_per_hour = gain / hours
)

 

Functions or aggregates

산술 연산  +, -, *, /, ^, sum( ), mean( ), …
모듈러(Modular) 연산 %/%(integer division, %%(remainder)
Logs log( ), log2( ), log10( )
Offsets lead( ), lag( ) # lead( ) 는 뒤에서분터, lag( ) 는 앞에서 부터 데이터를 NA 로 전환 시켜 준다.
Cumulative, rolling 합계(aggregates ) cumsum( ), cumprod( ), cummin( ), cummax( )
Logical comparisons <, ≤, >, ≥, ≠, ==
Ranking min_rank(-desc( ) #내림차순), dense_rank( ), percent)rank( ), cume_dist( ), ntile( )
y <-c(1, 2, 2, NA, 3, 4) 

min_rank(y)
#> [1]  1  2  2 NA  4  5 
min_rank(desc(y))
#> [1]  5  3  3 NA  2  1 # desc 가 붙으면 -를 붙여줌 
row_number(y)
#> [1]  1  2  3 NA  4  5
dense_rank(y)
#> [1]  1  2  2 NA  3  4
percent_rank(y)
#> [1] 0.00 0.25 0.25   NA 0.75 1.00
cume_dist(y)
#> [1] 0.2 0.6 0.6  NA 0.8 1.0