728x90
반응형
데이터 프레임(Data Frame)
이번 포스트에선 R 데이터 타입의 꽃인 데이터프레임에 대해 학습해보겠다. 데이터프레임은 R에서 가장 중요한 자료형으로, 우리에게 익숙한 액셀의 스프레드시트와 같이 표 형태로 정리한 모습을 가지고 있다.
데이터프레임은 R에서 가장 많이 쓰이는 데이터 타입이며, 대용량의 데이터를 다루기엔 비효율적이라서 빅데이터 분석 시엔 fread를 비롯한 다른 데이터 타입을 사용하지만, 이 역시 기본적으로 데이터 프레임과 비슷한 형태를 가지고 있으며, 다루는 방법 역시 데이터 프레임과 비슷하다.
- 데이터 프레임은 행렬과 같은 모습을 하고 있지만, 행렬과 다르게 다양한 변수, 관측치(Observations), 범주(Category) 등을 표한하기 위해 특화되어 있다.
- 행렬은 하나의 데이터 타입밖에 사용하지 못하지만, 데이터 프레임은 여러 가지 데이터 타입을 혼용하여 사용할 수 있다.
- 데이터 프레임의 각 열(Column)별 행(Row)의 길이는 모두 동일하다.
- 데이터 프레임의 행(Row, Record)은 데이터의 대상이 되는 객체 하나하나 이다.
- 데이터 프레임의 열(Columns, Variable)은 데이터 대상이 되는 객체의 속성을 나타내는 값이다.
각각의 Columns은 행렬과 달리 다양한 변수 타입을 가질 수 있다.
데이터프레임을 만들어보자
- 데이터 프레임은 벡터, 행렬로 만들 수 있다.
- 행렬을 그대로 데이터 프레임에 넣거나, 길이가 동일한 벡터들을 컬럼 하나하나에 배정하여 생성하면 된다.
- data.frame()
: 데이터 프레임을 생성한다. - 주요 Parameter
: data.frame(stringsAsFactors: 문자열을 자동으로 요인(Factor)형으로 변환해준다.)- data.frame에서 중요한 Parameter는 stringsAsFactors말고는 딱히 없다. data.frame에서 다른 Parameter들에 대한 내용을 읽어보고자 한다면, data.frame 코드를 치고 F1을 눌러서 보도록 하자.
- stringsAsFactors는 간단하지만, 상당히 중요한 Parameter로, 말 그대로 문자열을 요인(Factor)으로 바꿔주는 Parameter이다. 만약 string형인 열을 이용해서 새로운 변수를 만들어내거나, 특정 문자열을 분리해내는 작업을 하지 않는다면, 해당 Parameter를 TRUE로 두어 모두 Factor형으로 바꾸는 것이 유리하다.
- 그러나, 문자열에 대하여 어떠한 조작을 하는 경우엔, Factor형으론 조작이 매우 힘드므로, 가능하다면 해당 Parameter를 FALSE로 두는 것을 추천한다.
1) 벡터를 이용해서 데이터프레임을 만들어보자.
# 벡터로 데이터프레임을 만들어보자
vt1 = c("민철", "재성", "기훈", "현승", "현택")
vt2 = c(70, 60, 50, 80, 90)
vt3 = c(80, 70, 85, 65, 55)
df1 = data.frame(vt1, vt2, vt3)
df1
## vt1 vt2 vt3
## 1 민철 70 80
## 2 재성 60 70
## 3 기훈 50 85
## 4 현승 80 65
## 5 현택 90 55
- 데이터 프레임 안에 길이가 동일한 벡터를 넣어주면 된다.
- 길이가 다른 벡터를 함께 넣는 경우 에러가 뜨며 데이터프레임이 생성되지 않는다.
- 각 컬럼의 이름은 벡터의 이름으로 정해진다.
2) 행렬을 이용해서 데이터프레임을 만들어보자.
# 행렬로 데이터프레임을 만들어보자
vt = c("민철", "재성", "기훈", "현승", "현택", 70, 60, 50, 80, 90, 80, 70, 85, 65, 55)
mat = matrix(vt, ncol = 3, byrow = FALSE)
data.frame(mat)
## X1 X2 X3
## 1 민철 70 80
## 2 재성 60 70
## 3 기훈 50 85
## 4 현승 80 65
## 5 현택 90 55
- 데이터 프레임 안에 행렬을 넣어주면 된다.
- 각 컬럼의 이름은 X1, X2, X3...와 같은 방식으로 생성된다.
- 행렬은 하나의 변수 타입만 가질 수 있으므로, 행렬을 데이터 프레임으로 바꾸는 경우, 하나의 속성만 가진 형태로 데이터프레임이 만들어진다.
str(data.frame(mat))
'data.frame': 5 obs. of 3 variables:
$ X1: chr "민철" "재성" "기훈" "현승" ...
$ X2: chr "70" "60" "50" "80" ...
$ X3: chr "80" "70" "85" "65" ...
- 그러니 되도록이면 행렬로 데이터프레임을 만들기보다는 벡터를 이용해서 만들도록 하자.
- 만약 행렬로 만들어야한다면, 데이터프레임 생성 후, 각 컬럼의 변수 타입을 모두 바꿔주도록 하자.
데이터 프레임 변수의 이름을 바꿔보자.
- 이번엔 데이터 프레임 컬럼의 이름을 바꿔보자.
- 데이터 프레임 컬럼 이름 변경은 2가지 방법이 있다.
1) 데이터 프레임 생성 시, 벡터의 이름을 설정해준다.
# 벡터로 데이터프레임을 만들어보자
vt1 = c("민철", "재성", "기훈", "현승", "현택")
vt2 = c(70, 60, 50, 80, 90)
vt3 = c(80, 70, 85, 65, 55)
data.frame("name" = vt1, "math" = vt2, "english" = vt3)
## name math english
## 1 민철 70 80
## 2 재성 60 70
## 3 기훈 50 85
## 4 현승 80 65
## 5 현택 90 55
2) 생성된 데이터 프레임의 이름을 바꿔준다.
- colnames()
: data의 column의 이름들을 가지고 온다.
# 변수명을 바꿔보자.
vt1 = c("민철", "재성", "기훈", "현승", "현택")
vt2 = c(70, 60, 50, 80, 90)
vt3 = c(80, 70, 85, 65, 55)
df = data.frame(vt1, vt2, vt3)
colnames(df)
## [1] "vt1" "vt2" "vt3"
- colnames(df)를 하면, dataframe의 column 이름들을 가지고 온다.
colnames(df) <- c("name", "math", "english")
df
- colnames(df)에 벡터로 새로운 컬럼의 이름을 부여해보자.
## name math english
## 1 민철 70 80
## 2 재성 60 70
## 3 기훈 50 85
## 4 현승 80 65
## 5 현택 90 55
3) 행의 이름을 바꿔주자.
- 데이터프레임은 행을 index로 활용할 수 있으며, 행에 변수를 넣을 수도 있다.
- 단 행의 이름은 절대 중복되서는 안된다.
- 그러므로, ID를 만들어서 넣거나, 기존의 행 번호를 그대로 사용하도록 하자.
- rownames()
: data의 행 이름들을 가지고 온다.
# 행의 이름을 바꿔보자
vt1 = c("민철", "재성", "기훈", "현승", "현택")
vt2 = c(70, 60, 50, 80, 90)
vt3 = c(80, 70, 85, 65, 55)
df = data.frame(vt1, vt2, vt3)
rownames(df)
## [1] "1" "2" "3" "4" "5"
# 데이터프레임의 vt1을 row의 이름으로 사용해보자
rownames(df) <- df[,1]
# 데이터프레임에서 첫번째 컬럼과 행의 이름이 동일하므로, 첫번째 컬럼은 제거해서 가지고 와보자.
df[,-1]
## vt2 vt3
## 민철 70 80
## 재성 60 70
## 기훈 50 85
## 현승 80 65
## 현택 90 55
- 이번에 사용한 코드들을 보면, 행렬에서 다뤘던 indexing과 동일한 것을 볼 수 있다.
- 행렬도 데이터프레임처럼 행의 이름과 열의 이름을 동일한 방법으로 바꿀 수 있다.
- 데이터프레임의 Indexing에 대해선 다음 포스트에서 더 자세히 다뤄보도록 하겠다.
데이터 프레임의 정보를 살펴보자.
- 이번엔 데이터프레임의 기본적인 정보를 살펴보는 방법을 보자.
- str()
: 데이터프레임의 차원과 각 열에 대한 정보 출력 - head()
: 일반적인 데이터프레임은 매우 크므로, 모두 보는 것은 힘들다. head()를 사용하면, 맨 위에서 n개(기본값 6)의 행을 가지고 온다. 데이터프레임을 보고자 한다면, head()를 이용해서 보도록 하자. - tail()
: head()와 반대로 데이터프레임의 맨 아래에서 n개(기본값 6)의 행을 가지고 온다. tail()을 이용하면, 데이터프레임의 맨 아래 부분에 어떠한 특이사항이 있는지를 눈으로 쉽게 확인할 수 있다. - summary()
: 데이터프레임에 있는 변수별 기술통계량을 볼 수 있다.
변수 타입이 연속형변수인 경우에는 최소값, 최대값, 사분위 수, 평균을 볼 수 있다.
변수 타입이 문자형과 같은 범주형 변수인 경우에는 변수의 길이, Class, Mode 등을 볼 수 있다.
(Mode는 R의 기본 배경이 된 언어인 S language와 호환성을 가진 언어로, 간단하게 말하면 과거 버전의 타입 분류 방법이라고 생각하면 된다. R을 사용할 땐, Class가 우선이라고 간략하게 생각하고, Class에만 신경 쓰도록 하자.) - dim()
: 데이터프레임의 차원별 길이를 볼 수 있다.
데이터 프레임은 행과 열 2개의 차원으로 구성되어 있으며, dim() 함수를 이용하면 행의 수, 열의 수를 볼 수 있다. - View()
: 데이터프레임을 데이터 뷰어창에서 볼 수 있다.
데이터프레임 뿐만 아니라 행렬, 벡터 등도 볼 수 있다.
# 데이터 프레임의 구조를 살펴보자.
vt1 = c("민철", "재성", "기훈", "현승", "현택", "윤기" ,"재빈", "현희", "미선", "선화")
vt2 = c(70, 60, 50, 80, 90, 80, 65, 75, 90, 80)
vt3 = c(80, 70, 85, 65, 55, 70, 75, 80, 65, 75)
df = data.frame("name" = vt1, "math" = vt2, "english" = vt3)
df
## name math english
## 1 민철 70 80
## 2 재성 60 70
## 3 기훈 50 85
## 4 현승 80 65
## 5 현택 90 55
## 6 윤기 80 70
## 7 재빈 65 75
## 8 현희 75 80
## 9 미선 90 65
## 10 선화 80 75
# 데이터 프레임의 차원과 각 열에 대한 정보를 알아보자.
str(df)
## 'data.frame': 10 obs. of 3 variables:
## $ name : chr "민철" "재성" "기훈" "현승" ...
## $ math : num 70 60 50 80 90 80 65 75 90 80
## $ english: num 80 70 85 65 55 70 75 80 65 75
# 데이터 프레임의 위부터 n행까지 추출한다(기본값은 6).
head(df, n = 5)
## name math english
## 1 민철 70 80
## 2 재성 60 70
## 3 기훈 50 85
## 4 현승 80 65
## 5 현택 90 55
# 데이터 프레임의 아래부터 n행까지 추출한다(기본값은 6).
tail(df, n = 5)
## name math english
## 6 윤기 80 70
## 7 재빈 65 75
## 8 현희 75 80
## 9 미선 90 65
## 10 선화 80 75
# 변수별 요약통계량 출력
summary(df)
## name math english
## Length:10 Min. :50.00 Min. :55.00
## Class :character 1st Qu.:66.25 1st Qu.:66.25
## Mode :character Median :77.50 Median :72.50
## Mean :74.00 Mean :72.00
## 3rd Qu.:80.00 3rd Qu.:78.75
## Max. :90.00 Max. :85.00
# 데이터 프레임의 차원별 길이 출력
dim(df)
## [1] 10 3
# 데이터 뷰어로 데이터 프레임을 보자.
View(df)
- View() 함수를 이용하는 경우, 데이터 프레임을 데이터 뷰어라는 새로운 창에서 크게 볼 수 있다.
- R에서 매우 큰 데이터 프레임을 head()나 tail()가 아닌 그 자체로 불러오는 경우, R이 뻗어버릴 수 도 있지만(너무 큰 데이터를 표현하면, 부하가 매우 크므로, 가능한 dataframe 이름만 쳐서 가지고 오는 행동은 하지 말자) View를 사용해서 데이터 뷰어에서 보면 R이 뻗지는 않는다.
(물론, 데이터의 크기가 너무 크므로, 보는 것이 굉장히 불편하긴 하다.)
지금까지 데이터프레임을 만들고 데이터프레임의 기본적인 정보를 보는 법에 대해 학습해보았다.
다음 포스트에선 데이터프레임에 새로운 변수를 추가해보거나, Indexing 하는 방법 등을 공부해보자.
728x90
반응형
'R > Basic' 카테고리의 다른 글
R(기초) 리스트(List) (0) | 2020.06.22 |
---|---|
R(기초) 데이터프레임(DataFrame)(2부) (0) | 2020.06.22 |
R(기초) 배열(Array) (0) | 2020.06.19 |
R(기초) 행렬(Matrix)(3부) (0) | 2020.06.19 |
R(기초) 행렬(Matrix)(2부) (0) | 2020.06.19 |