R 데이터 프레임은 데이터 분석을 할 때 가장 많이 사용하는 객체입니다. 그만큼 하나도 빠짐없이 공부해놔야 하죠. 이번 포스팅에서는 R 데이터 프레임 만들기와 데이터 프레임의 형제 격인 tidyver의 데이터 프레임, R tibble 만들기 방법에 대하여 알아보겠습니다.

블로그 글을 작성함에 있어서 최대한 정확한 정보를 제공하고자 노력하고 있습니다만, 간혹 오류가 있을 수 있습니다. 발견시 댓글 달아주시면 정정하겠습니다. 블로그의 링크들을 통하여 구매하시면 소정의 커미션이 슬통에 들어옵니다.

R 데이터 프레임(Data frame)이란?

R 데이터 프레임은 R 프로그래밍 언어에서 테이블 형태의 데이터를 저장하고 조작하기 위한 데이터 구조입니다. 데이터 프레임은 행과 열로 구성되어 있으며, 각 열은 서로 다른 데이터 타입을 가질 수 있습니다. 이러한 이유로 R 데이터 프레임을 엑셀이나 구글 스프레드시트에 비유해서 많이 설명하죠.

r 데이터 프레임 만들기, r tibble 만들기
데이터 프레임은 행과 열로 이루어진 행렬과 닮아있습니다.

2차원 모양의 프레임!

행렬의 경우 구성원들이 모두 같은 정보 저장 모드여야만 했습니다. 하지만 데이터 프레임의 경우는 각 열에 들어있는 데이터 정보 타입이 달라도 됩니다.

cbind(as.character(c(1:5)), 6:10)
>>      [,1] [,2]
>> [1,] "1"  "6" 
>> [2,] "2"  "7" 
>> [3,] "3"  "8" 
>> [4,] "4"  "9" 
>> [5,] "5"  "10"

하지만, 데이터 프레임은 각 열의 mode가 다를 수 있습니다.

df <- data.frame(col1 = c("one", "two", "three", "four", "five"),
           col2 = c(6:10))
df
>>    col1 col2
>> 1   one    6
>> 2   two    7
>> 3 three    8
>> 4  four    9
>> 5  five   10
mode(df$col1)
>> [1] "character"
mode(df$col2)
>> [1] "numeric"

데이터 프레임 만들기

R에서는 data.frame() 함수를 사용하여 데이터 프레임을 선언 할 수 있습니다. 데이터 프레임은 데이터 분석에서 가장 많이 사용되는 자료 저장 클래스 중 하나입니다.

R 빈 데이터 프레임 만들기

R에서 빈 데이터 프레임을 만드는 방법은 각 변수의 이름에 원하는 정보의 형태를 지정해주는 것입니다. 다음의 코드를 보겠습니다.

my_df <- data.frame(실수변수=double(),
                    정수변수=integer(),
                    팩터변수=factor(),
                    논리변수=logical(),
                    문자열변수=character())
str(my_df)
>> 'data.frame':    0 obs. of  5 variables:
>>  $ 실수변수  : num 
>>  $ 정수변수  : int 
>>  $ 팩터변수  : Factor w/ 0 levels: 
>>  $ 논리변수  : logi 
>>  $ 문자열변수: chr

위의 함수들에 대응하는 정보유형을 정리해보면 다음과 같습니다.

  • double(): 실수 정보
  • integer(): 정수 정보
  • factor(): 범주형 정보
  • logical(): 논리값 정보
  • character(): 문자열 정보

선언방법

데이터 프레임을 만들 때 각 열에 들어갈 벡터들을 이름과 값을 연결하여 data.frame() 함수에 차례대로 넣어줍니다.

my_df <- data.frame(name = c("issac", "bomi"), 
                    birthmonth = c(5, 4))
my_df
>>    name birthmonth
>> 1 issac          5
>> 2  bomi          4

tidyverse 패키지의 tibble 데이터 프레임

현재 R에서 데이터 분석 패키지의 표준이 되고있는 tidyverse 패키지에서는 기존의 데이터 프레임 (data.frame())을 개선 시킨 새로운 데이터 프레임 tibble()을 사용합니다.

tibble은 기존의 data.frame()과 비슷하지만 몇 가지 편리한 기능이 추가되어 있습니다.

  1. 열의 데이터 타입 표시: tibble은 각 열의 데이터 타입을 표시해 줍니다. 이를 통해 데이터 프레임의 구조를 더 쉽게 파악할 수 있습니다.
  2. 데이터 일부만 표시: 데이터 프레임의 열이 많을 경우, tibble은 앞부분 몇 개의 행만 표시하고, 나머지는 생략하여 한 화면에 표시해 줍니다. 이로 인해 출력 화면이 깔끔해지고 데이터를 빠르게 살펴볼 수 있습니다.
  3. 데이터 프레임 생성의 편의성: tibble() 함수는 좀 더 편리하게 데이터 프레임을 생성할 수 있습니다.

tibble() 함수를 사용해서 tibble 생성하기

tibble() 함수를 사용해서 tibble을 만들어보겠습니다. 데이터 프레임을 만들 때처럼 똑같은 문법을 사용합니다. tibble() 함수 칼럼 이름과 내용을 연결해 줍니다.

library(tidyverse)
my_tb <- tibble(name = c("issac", "bomi"), 
                birthmonth = c(5, 4))
my_tb
>> # A tibble: 2 × 2
>>   name  birthmonth
>>   <chr>      <dbl>
>> 1 issac          5
>> 2 bomi           4

tibble()과 data.frame()의 가장 큰 차이는 앞에 정의된 칼럼을 뒤에 정의 될 칼럼에 사용할 수 있다는 것입니다. 다음의 코드를 살펴보면, x열이 먼저 정의되었으므로, y 열을 정의할 때 x를 사용하여 정의할 수 있습니다.

# 데이터 프레임은 불가능
data.frame(x = 1:5, y = x^2)
>> Error in eval(expr, envir, enclos): object 'x' not found
# tibble은 가능
tibble(x = 1:5, y = x^2)
>> # A tibble: 5 × 2
>>       x     y
>>   <int> <dbl>
>> 1     1     1
>> 2     2     4
>> 3     3     9
>> 4     4    16
>> 5     5    25

또한, tibble()은 자동으로 칼럼의 데이터 타입을 잡아냅니다.

tibble(z = paste("num", 1:5),
       `칼럼이름 공백` = as_factor(z))
>> # A tibble: 5 × 2
>>   z     `칼럼이름 공백`
>>   <chr> <fct>          
>> 1 num 1 num 1          
>> 2 num 2 num 2          
>> 3 num 3 num 3          
>> 4 num 4 num 4          
>> 5 num 5 num 5

칼럼 이름에 공백이 있는 경우, 그레이브 엑센트 기호 ` 로 묶어서 표현합니다. 하지만, 되도록 칼럼 이름에 공백을 넣지 않습니다.

손으로 입력해서 tibble 만들기

tribble() 함수는 손으로 데이터를 일일이 입력할 때 사용되며, 데이터 프레임을 만드는 데에 특히 유용합니다. 열 이름을 ~ 기호를 사용하여 표시하고, 사각형 형태로 데이터를 입력합니다.

tab_a <- tribble(
     ~id, ~score, ~group,
    1L,    35,   "A",
    3L,    70,   "A",
    4L,    63,   "B",
    5L,    80,   "B"
    )
tab_a
>> # A tibble: 4 × 3
>>      id score group
>>   <int> <dbl> <chr>
>> 1     1    35 A    
>> 2     3    70 A    
>> 3     4    63 B    
>> 4     5    80 B

id 변수에는 정수 정보를 입력하기 위하여 L을 사용하였습니다.

기존 데이터 프레임을 tibble로 변환 시키는 방법

데이터 프레임으로 선언이 된 변수라도, as_tibble()을 사용하여 tibble로 변환 할 수 있습니다.

library(tidyverse)
head(mtcars, n = 2)
>>               mpg cyl disp  hp drat    wt  qsec vs am gear carb
>> Mazda RX4      21   6  160 110  3.9 2.620 16.46  0  1    4    4
>> Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
as_tibble(mtcars) |> head(2)
>> # A tibble: 2 × 11
>>     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
>>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
>> 1    21     6   160   110   3.9  2.62  16.5     0     1     4     4
>> 2    21     6   160   110   3.9  2.88  17.0     0     1     4     4

데이터 프레임은 rowname이 있으나, tibble은 rowname이 없습니다. 만약 데이터 프레임의 행 이름을 tibble에 포함하고 싶은 경우는 다음과 같이 하면 됩니다.

as_tibble(mtcars, rownames = "model") |> head(2)
>> # A tibble: 2 × 12
>>   model          mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
>>   <chr>        <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
>> 1 Mazda RX4       21     6   160   110   3.9  2.62  16.5     0     1     4     4
>> 2 Mazda RX4 W…    21     6   160   110   3.9  2.88  17.0     0     1     4     4

데이터 프레임과 tibble은 거의 비슷하므로, 이후의 설명은 tibble을 기준으로 설명하도록 하겠습니다. 따라서 tibble() 이 들어있는 패키지 tidyverse를 로드하고 따라오시기 바랍니다.


본 포스팅은 R 프로그래밍 기초 공략.zip 교재의 일부분 입니다. 본 교재는 R을 독학하시는 분들을 위하여 특별히 제작된 교재입니다. R을 이제 막 시작하셨다면 슬기로운 통계생활과 같이 공부해보세요!

Similar Posts