강의영상

- (1/3) 데이터프레임, 티블 (1)

- (2/3) 데이터프레임, 티블 (2)

- (3/3) 기말고사관련 설명

library(tidyverse)
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──

 ggplot2 3.3.5      purrr   0.3.4
 tibble  3.1.6      dplyr   1.0.7
 tidyr   1.1.4      stringr 1.4.0
 readr   2.1.1      forcats 0.5.1

── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
 dplyr::filter() masks stats::filter()
 dplyr::lag()    masks stats::lag()

데이터프레임, 티블을 만드는 방법

- 방법1: 선언하여 만들기 (새롭게 정의)

tibble(v1=1:3, v2=c(T,F,T), v3=c('a','b','c'))
A tibble: 3 × 3
v1 v2 v3
<int> <lgl> <chr>
1 TRUE a
2 FALSE b
3 TRUE c
  • 각 열들의 자료형이 모두 달라도 가능 (티블의 매력)
  • 티블의 형태는 매트릭스 같지만 이처럼 다른 자료형이 들어가는 것은 리스트를 연상시킴

- 방법2: 선언하여 만들기2 (기존에 정의된 벡터들을 활용)

x=1:5
y=c('a','b','c','d','e')
tibble(x,y)
A tibble: 5 × 2
x y
<int> <chr>
1 a
2 b
3 c
4 d
5 e
tibble(v1=x,v2=y)
A tibble: 5 × 2
v1 v2
<int> <chr>
1 a
2 b
3 c
4 d
5 e

- 방법3: 벡터나 매트릭스를 만들고 그것을 티블로 변형

as_tibble(x)
A tibble: 5 × 1
value
<int>
1
2
3
4
5
as_tibble(cbind(x,y))
A tibble: 5 × 2
x y
<chr> <chr>
1 a
2 b
3 c
4 d
5 e
  • 모든 컬럼이 chr로 저장되는 단점이 있음

- 방법4: 리스트를 만들고 그것을 티블로 변형

as_tibble(list(x=x,y=y))
A tibble: 5 × 2
x y
<int> <chr>
1 a
2 b
3 c
4 d
5 e
as_tibble(list(v1=x,v2=y))
A tibble: 5 × 2
v1 v2
<int> <chr>
1 a
2 b
3 c
4 d
5 e

- 데이터프레임의 경우도 티블과 비슷하게 만들 수 있다.

  • as_tibble 대신 data.frame
  • tibble 대신 data.frame
data.frame(v1=1:3, v2=c(T,F,T), v3=c('a','b','c'))
A data.frame: 3 × 3
v1 v2 v3
<int> <lgl> <chr>
1 TRUE a
2 FALSE b
3 TRUE c
data.frame(x,y)
A data.frame: 5 × 2
x y
<int> <chr>
1 a
2 b
3 c
4 d
5 e
data.frame(v1=x,v2=y)
A data.frame: 5 × 2
v1 v2
<int> <chr>
1 a
2 b
3 c
4 d
5 e
data.frame(x)
A data.frame: 5 × 1
x
<int>
1
2
3
4
5
data.frame(cbind(x,y))
A data.frame: 5 × 2
x y
<chr> <chr>
1 a
2 b
3 c
4 d
5 e
data.frame(list(x=x,y=y))
A data.frame: 5 × 2
x y
<int> <chr>
1 a
2 b
3 c
4 d
5 e
data.frame(list(v1=x,v2=y))
A data.frame: 5 × 2
v1 v2
<int> <chr>
1 a
2 b
3 c
4 d
5 e

- tibble()과 data.frame()의 결과가 다를수도 있음

lst = list(x=x,y=y,z=cbind(x,y))
lst
$x
<ol class=list-inline>
  • 1
  • 2
  • 3
  • 4
  • 5
  • </ol>
    $y
    <ol class=list-inline>
  • 'a'
  • 'b'
  • 'c'
  • 'd'
  • 'e'
  • </ol>
    $z
    A matrix: 5 × 2 of type chr
    x y
    1 a
    2 b
    3 c
    4 d
    5 e
    data.frame(lst)
    
    A data.frame: 5 × 4
    x y z.x z.y
    <int> <chr> <chr> <chr>
    1 a 1 a
    2 b 2 b
    3 c 3 c
    4 d 4 d
    5 e 5 e
    as_tibble(lst)
    
    A tibble: 5 × 3
    x y z
    <int> <chr> <chr[,2]>
    1 a 1, a
    2 b 2, b
    3 c 3, c
    4 d 4, d
    5 e 5, e

    - 데이터프레임과 티블은 as_tibble()과 data.frame()을 이용하여 서로의 형태로 변환가능하다.

    data.frame(v1=1:3, v2=c(T,F,T), v3=c("a","b","c"))
    
    A data.frame: 3 × 3
    v1 v2 v3
    <int> <lgl> <chr>
    1 TRUE a
    2 FALSE b
    3 TRUE c
    data.frame(v1=1:3, v2=c(T,F,T), v3=c("a","b","c")) %>% as_tibble
    
    A tibble: 3 × 3
    v1 v2 v3
    <int> <lgl> <chr>
    1 TRUE a
    2 FALSE b
    3 TRUE c
    data.frame(v1=1:3, v2=c(T,F,T), v3=c("a","b","c")) %>% as_tibble %>% data.frame
    
    A data.frame: 3 × 3
    v1 v2 v3
    <int> <lgl> <chr>
    1 TRUE a
    2 FALSE b
    3 TRUE c

    즉 아래가 가능함

    df= data.frame(v1=1:3, v2=c(T,F,T), v3=c("a","b","c"))
    df
    
    A data.frame: 3 × 3
    v1 v2 v3
    <int> <lgl> <chr>
    1 TRUE a
    2 FALSE b
    3 TRUE c
    df=as_tibble(df)
    df
    
    A tibble: 3 × 3
    v1 v2 v3
    <int> <lgl> <chr>
    1 TRUE a
    2 FALSE b
    3 TRUE c
    df=data.frame(df)
    df
    
    A data.frame: 3 × 3
    v1 v2 v3
    <int> <lgl> <chr>
    1 TRUE a
    2 FALSE b
    3 TRUE c

    데이터프레임, 티블의 해석

    - 매트릭스: (1) 모든 열은 동일한 숫자의 row를 가져야하며 (2) 행렬의 모든 원소는 동일한 자료형을 가져야 함

    - 리스트: (1) 모든 원소가 동일한 길이의 오브젝트로 구성될 필요가 없다. (2) 그리고 리스트의 각 원소가 동일한 자료형을 가질 필요도 없다.

    - 티블 혹은 데이터프레임은

    • 자료형이 자유로운 매트릭스로 해석할 수 있고
    • 모든 원소가 동일한 길이의 오브젝트로 구성된 리스트

    로 생각할 수 있다.

    데이터프레임과 티블의 사용법

    - 데이터셋팅

    x = 1:3 
    y = c(T,F,T)
    z = c('a','b','c')
    
    lst = list(x=x,y=y,z=z)
    mat = cbind(x,y,z) 
    df = tibble(x=x,y=y,z=z)
    
    print(lst)
    print(mat)
    print(df)
    
    $x
    [1] 1 2 3
    
    $y
    [1]  TRUE FALSE  TRUE
    
    $z
    [1] "a" "b" "c"
    
         x   y       z  
    [1,] "1" "TRUE"  "a"
    [2,] "2" "FALSE" "b"
    [3,] "3" "TRUE"  "c"
    # A tibble: 3 × 3
          x y     z    
      <int> <lgl> <chr>
    1     1 TRUE  a    
    2     2 FALSE b    
    3     3 TRUE  c    
    

    - df에서 열들의 이름을 알고 싶다.

    print(colnames(lst))
    print(colnames(mat))
    print(colnames(df))
    
    NULL
    [1] "x" "y" "z"
    [1] "x" "y" "z"
    
    print(names(lst))
    print(names(mat))
    print(names(df))
    
    [1] "x" "y" "z"
    NULL
    [1] "x" "y" "z"
    

    - df에서 첫번째 열을 추출하고 싶다?

    mat[,1]
    #lst[,1]
    df[,1]
    
    <ol class=list-inline>
  • '1'
  • '2'
  • '3'
  • </ol>
    A tibble: 3 × 1
    x
    <int>
    1
    2
    3
    lst[[1]]
    df[[1]]
    
    <ol class=list-inline>
  • 1
  • 2
  • 3
  • </ol>
    <ol class=list-inline>
  • 1
  • 2
  • 3
  • </ol>

    - df를 매트릭스처럼 생각하는건 사실 직관적이지만 리스트라고는 생각하기 어렵다. df를 리스트라고 해석하면 아래와 같은 문법들도 쉽게 이해가능하다.

    lst[1]
    df[1]
    
    $x = <ol class=list-inline>
  • 1
  • 2
  • 3
  • </ol>
    A tibble: 3 × 1
    x
    <int>
    1
    2
    3
    lst$x
    df$x
    
    <ol class=list-inline>
  • 1
  • 2
  • 3
  • </ol>
    <ol class=list-inline>
  • 1
  • 2
  • 3
  • </ol>
    lst['x']
    df['x']
    
    $x = <ol class=list-inline>
  • 1
  • 2
  • 3
  • </ol>
    A tibble: 3 × 1
    x
    <int>
    1
    2
    3
    lst[1:2]
    df[1:2]
    
    $x
    <ol class=list-inline>
  • 1
  • 2
  • 3
  • </ol>
    $y
    <ol class=list-inline>
  • TRUE
  • FALSE
  • TRUE
  • </ol>
    A tibble: 3 × 2
    x y
    <int> <lgl>
    1 TRUE
    2 FALSE
    3 TRUE

    - 매트릭스처럼 생각한다면 아래와 같은 형태도 가능하다.

    mat[2:3,]
    df[2:3,]
    
    A matrix: 2 × 3 of type chr
    x y z
    2 FALSE b
    3 TRUE c
    A tibble: 2 × 3
    x y z
    <int> <lgl> <chr>
    2 FALSE b
    3 TRUE c
    mat[,1:2]
    df[,1:2]
    
    A matrix: 3 × 2 of type chr
    x y
    1 TRUE
    2 FALSE
    3 TRUE
    A tibble: 3 × 2
    x y
    <int> <lgl>
    1 TRUE
    2 FALSE
    3 TRUE
    mat[,'x']
    df[,'x']
    
    <ol class=list-inline>
  • '1'
  • '2'
  • '3'
  • </ol>
    A tibble: 3 × 1
    x
    <int>
    1
    2
    3
    mat[,c('x','y')]
    df[,c('x','y')]
    
    A matrix: 3 × 2 of type chr
    x y
    1 TRUE
    2 FALSE
    3 TRUE
    A tibble: 3 × 2
    x y
    <int> <lgl>
    1 TRUE
    2 FALSE
    3 TRUE
    mat[2:3,c('x','y')]
    df[2:3,c('x','y')]
    
    A matrix: 2 × 2 of type chr
    x y
    2 FALSE
    3 TRUE
    A tibble: 2 × 2
    x y
    <int> <lgl>
    2 FALSE
    3 TRUE