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 15:11:41 2020-10-08     1 0.0662 p    
##  2 2020-10-06 20:41:50 2020-10-25     2 0.419  u    
##  3 2020-10-07 09:21:16 2020-10-28     3 0.436  i    
##  4 2020-10-07 04:02:02 2020-10-21     4 0.939  i    
##  5 2020-10-06 18:50:13 2020-10-26     5 0.739  q    
##  6 2020-10-06 15:59:20 2020-10-16     6 0.923  p    
##  7 2020-10-07 05:55:53 2020-10-27     7 0.297  q    
##  8 2020-10-06 19:28:20 2020-10-27     8 0.342  p    
##  9 2020-10-06 23:13:16 2020-10-27     9 0.287  d    
## 10 2020-10-07 03:55:35 2020-11-03    10 0.123  z    
## # ... 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.19358967 0.38364911 0.57701078 0.05356165 0.81407139

df[[“x”]]

#> [1] 0.19358967 0.38364911 0.57701078 0.05356165 0.81407139

#위치로추출

df[[1]]

#> [1] 0.19358967 0.38364911 0.57701078 0.05356165 0.81407139

df %>% .$x

#> [1] 0.19358967 0.38364911 0.57701078 0.05356165 0.81407139

df %>% .[[“x”]]

#> [1] 0.19358967 0.38364911 0.57701078 0.05356165 0.81407139

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 에서 이 참조 변수를 어떻게 추출할 수 있는가?

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