R 데이터 프레임은 데이터 분석을 할 때 가장 많이 사용하는 객체입니다. 그만큼 하나도 빠짐없이 공부해놔야 하죠. 이번 포스팅에서는 R 데이터 프레임 만들기와 데이터 프레임의 형제 격인 tidyver의 데이터 프레임, R tibble 만들기 방법에 대하여 알아보겠습니다.
R 데이터 프레임(Data frame)이란?
R 데이터 프레임은 R 프로그래밍 언어에서 테이블 형태의 데이터를 저장하고 조작하기 위한 데이터 구조입니다. 데이터 프레임은 행과 열로 구성되어 있으며, 각 열은 서로 다른 데이터 타입을 가질 수 있습니다. 이러한 이유로 R 데이터 프레임을 엑셀이나 구글 스프레드시트에 비유해서 많이 설명하죠.

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
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:
>>
정수변수 : int
>>
논리변수 : 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()
과 비슷하지만 몇 가지 편리한 기능이 추가되어 있습니다.
- 열의 데이터 타입 표시:
tibble
은 각 열의 데이터 타입을 표시해 줍니다. 이를 통해 데이터 프레임의 구조를 더 쉽게 파악할 수 있습니다. - 데이터 일부만 표시: 데이터 프레임의 열이 많을 경우,
tibble
은 앞부분 몇 개의 행만 표시하고, 나머지는 생략하여 한 화면에 표시해 줍니다. 이로 인해 출력 화면이 깔끔해지고 데이터를 빠르게 살펴볼 수 있습니다. - 데이터 프레임 생성의 편의성:
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을 이제 막 시작하셨다면 슬기로운 통계생활과 같이 공부해보세요!