7.1 들어가기

7.1.1 준비하기

library(tidyverse)
## -- Attaching packages -------------------------------------------------------- tidyverse 1.3.0 --
## √ ggplot2 3.3.2     √ purrr   0.3.4
## √ tibble  3.0.3     √ dplyr   1.0.2
## √ tidyr   1.1.2     √ stringr 1.4.0
## √ readr   1.3.1     √ forcats 0.5.0
## -- Conflicts ----------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

7.2 티블생성하기

as_tibble(iris)
## # A tibble: 150 x 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
##  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 
## # ... with 140 more rows
tibble(
x = 1:5,
y = 1,
z = x ^ 2 + y
)
## # A tibble: 5 x 3
##       x     y     z
##   <int> <dbl> <dbl>
## 1     1     1     2
## 2     2     1     5
## 3     3     1    10
## 4     4     1    17
## 5     5     1    26
tb <- tibble(
`:)` = "스마일",
` ` = "스페이스",
`2000` = "숫자"
)
tb
## # A tibble: 1 x 3
##   `:)`   ` `      `2000`
##   <chr>  <chr>    <chr> 
## 1 스마일 스페이스 숫자
tribble(
~x, ~y, ~z,
 #--|--|----
"a", 2, 3.6,
"b", 1, 8.5
)
## # A tibble: 2 x 3
##   x         y     z
##   <chr> <dbl> <dbl>
## 1 a         2   3.6
## 2 b         1   8.5

7.3 티블 vs 데이터프레임

7.3.1 화면출력

tibble(
a = lubridate::now() + runif(1e3) * 86400,
b = lubridate::today() + runif(1e3) *30,
c = 1:1e3,
d = runif(1e3),
e = sample(letters, 1e3, replace = TRUE)
)
## # A tibble: 1,000 x 5
##    a                   b              c      d e    
##    <dttm>              <date>     <int>  <dbl> <chr>
##  1 2020-10-06 21:37:34 2020-10-15     1 0.284  a    
##  2 2020-10-07 00:13:57 2020-10-29     2 0.861  n    
##  3 2020-10-06 21:38:10 2020-10-21     3 0.707  e    
##  4 2020-10-07 08:47:59 2020-10-17     4 0.496  u    
##  5 2020-10-07 04:08:11 2020-10-23     5 0.354  w    
##  6 2020-10-07 05:46:52 2020-10-20     6 0.557  x    
##  7 2020-10-07 01:51:18 2020-11-03     7 0.770  d    
##  8 2020-10-07 10:45:52 2020-10-28     8 0.0126 r    
##  9 2020-10-07 09:00:29 2020-10-29     9 0.734  a    
## 10 2020-10-06 23:21:40 2020-10-27    10 0.260  p    
## # ... with 990 more rows
nycflights13::flights %>%
print(n = 10, width = Inf)
## # 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
##  7  2013     1     1      555            600        -5      913            854
##  8  2013     1     1      557            600        -3      709            723
##  9  2013     1     1      557            600        -3      838            846
## 10  2013     1     1      558            600        -2      753            745
##    arr_delay carrier flight tailnum origin dest  air_time distance  hour minute
##        <dbl> <chr>    <int> <chr>   <chr>  <chr>    <dbl>    <dbl> <dbl>  <dbl>
##  1        11 UA        1545 N14228  EWR    IAH        227     1400     5     15
##  2        20 UA        1714 N24211  LGA    IAH        227     1416     5     29
##  3        33 AA        1141 N619AA  JFK    MIA        160     1089     5     40
##  4       -18 B6         725 N804JB  JFK    BQN        183     1576     5     45
##  5       -25 DL         461 N668DN  LGA    ATL        116      762     6      0
##  6        12 UA        1696 N39463  EWR    ORD        150      719     5     58
##  7        19 B6         507 N516JB  EWR    FLL        158     1065     6      0
##  8       -14 EV        5708 N829AS  LGA    IAD         53      229     6      0
##  9        -8 B6          79 N593JB  JFK    MCO        140      944     6      0
## 10         8 AA         301 N3ALAA  LGA    ORD        138      733     6      0
##    time_hour          
##    <dttm>             
##  1 2013-01-01 05:00:00
##  2 2013-01-01 05:00:00
##  3 2013-01-01 05:00:00
##  4 2013-01-01 05:00:00
##  5 2013-01-01 06:00:00
##  6 2013-01-01 05:00:00
##  7 2013-01-01 06:00:00
##  8 2013-01-01 06:00:00
##  9 2013-01-01 06:00:00
## 10 2013-01-01 06:00:00
## # ... with 336,766 more rows
nycflights13::flights %>%
view()

7.3.2 서브셋하기

df <- tibble(
x = runif(5),
y = rnorm(5)
)

#이름으로추출

df$x
## [1] 0.07920996 0.80428598 0.91176352 0.86152755 0.89637309
df[["x"]]
## [1] 0.07920996 0.80428598 0.91176352 0.86152755 0.89637309

#위치로추출

df[[1]]
## [1] 0.07920996 0.80428598 0.91176352 0.86152755 0.89637309
df %>% .$x
## [1] 0.07920996 0.80428598 0.91176352 0.86152755 0.89637309
df %>% .[["x"]]
## [1] 0.07920996 0.80428598 0.91176352 0.86152755 0.89637309

7.4 이전 코드와 상호작용

class(as.data.frame(tb))
## [1] "data.frame"

7.4.1 연습문제

1.어떤 객체가 tibble 인지 알 수 있는 방법은 무엇인가? (힌트: 일반 데이터프레임인 mtcars 를 화면출력해보라.) 출력해기, class, is_tibble()

2.data.frame 과 이에 해당하는 tibble 에서 다음 연산들을 비교하고 차이를 밝혀보라. 차이점은 무엇인가? 데이터프레임의 기본 동작이 혼란스러운 점은 무엇인가?

df <- data.frame(abc = 1, xyz = "a")
df$x
## [1] "a"
df[, "xyz"]
## [1] "a"
df[, c("abc", "xyz")]
##   abc xyz
## 1   1   a

3.객체에 변수 이름을 저장하고 있는 경우 (예: var <- “mpg” ), tibble 에서 이 참조 변수를 어떻게 추출할 수 있는가? $, [[]], enframe()

4.다음의 데이터프레임에서 비구문론적 이름을 참조하는 방법을 연습해보라.

  1. 1이라는 이름의 변수를 추출하기.
enframe(1:3)
## # A tibble: 3 x 2
##    name value
##   <int> <int>
## 1     1     1
## 2     2     2
## 3     3     3
  1. 1 vs 2 의 산점도를 플롯팅 하기.

  2. 열 2 를 열 1 로 나누어, 3 이라는 새로운 열을 생성하기.

  3. 열의 이름을 one, two, three 로 변경하기

enframe(list(one = 1, two = 2:3, three = 4:6))
## # A tibble: 3 x 2
##   name  value    
##   <chr> <list>   
## 1 one   <dbl [1]>
## 2 two   <int [2]>
## 3 three <int [3]>
annoying <- tibble(
  `1` = 1:10,
  `2` = `1` * 2 + rnorm(length('1'))
)

5.tibble::enframe() 은 어떤 동작을 하는가? 언제 사용하겠는가? 변수추출

6.tibble 의 바닥글(footer)에 화면출력되는 열 이름의 개수를 제어하는 옵션은 무엇인가? print