7. DataFrame
in Study on R Programming
Overview
R에서 제공하는 자료 구조(Data structure)에서 DataFrame에 대해 더 알아본다.
DataFrame의 특징
- 데이터베이스의 테이블 구조와 유사
- 컬럼 단위로 서로 다른 타입의 데이터 저장이 가능
- 리스트와 벡터의 혼합형으로 컬럼은 리스트, 컬럼 내의 데이터는 벡터 자료 구조를 가짐
- 생성 함수 :
data.frame(), read.table(), read.csv()
- 자료 처리 함수 :
str(), ncol(), nrow(), apply(), summary(), subset()
등 - 생성 방법 : Vector, Matrix, 파일(txt, excel, csv 파일) 이용
데이터 프레임의 주요 함수
함수 | 기능 |
---|---|
ncol(dataframe) | dataframe의 열 개수 |
nrow(dataframe) | dataframe의 행 개수 |
names(dataframe) | dataframe의 열 이름 출력 |
rownames(dataframe) /row.names(dataframe) | dataframe의 행 이름 출력 |
colwnames(dataframe) /col.names(dataframe) | dataframe의 열 이름 출력 # 열 이름 설정 : colwnames(dataframe) <- c('name', 'age') |
dataframe[c(1:5),] | 1, 2, 3, 4, 5 행의 순서대로 출력 |
dataframe[c(1:5)] | 1, 2, 3, 4, 5 열의 순서대로 출력 |
DataFrame을 생성하는 여러 방법
데이터프레임은 열에 대하여 서로 다른 형식의 자료형을 포함할 수 있기 때문에 벡터와 행렬을 이용하여 데이터프레임 객체를 생성할 수 있다.
또한 기존의 데이터 파일을 불러와서 데이터프레임 객체를 생성할 수도 있다.
엑셀 파일, 텍스트 파일 등을 이용하여 여러 가지 방법으로 데이터 프레임을 만드는 예를 살펴본다.
벡터를 이용한 객체 생성
# 여러 개의 벡터를 이용하여 생성이 가능하다.
no <- c(1, 2, 3)
name <- c('hong', 'lee', 'kim')
pay <- c(100, 200, 300)
emp01 <- data.frame(No=no, Name=name, Pay=pay)
emp01
실행 결과
No Name Pay
1 1 hong 100
2 2 lee 200
3 3 kim 300
행렬을 이용한 생성
m <- matrix(c(1, 'hong', 100, 2, 'kim', 200, 3, 'kang', 300), 3, byrow=T)
emp02 <- data.frame(m)
emp02
실행 결과
X1 X2 X3
1 1 hong 100
2 2 kim 200
3 3 kang 300
file을 이용한 생성
emp03 <- read.table('emp.txt', header=T, sep='')
emp03
실행 결과
사번 이름 급여
1 1 hong 100
2 2 kim 200
3 3 kang 300
col.names
속성 사용
컬럼명이 없는 경우, col.names
속성을 사용한다.
name <- c('사번', '이름', '급여')
emp04 <- read.csv('emp2.csv', header=F, col.names=name)
emp04
실행 결과
사번 이름 급여
1 1 hong 100
2 2 kim 200
3 3 kang 300
merge
두 개 이상의 데이터 프레임을 대상으로 특정 컬럼을 기준으로 하나로 합친 데이터 프레임을 생성할 수 있다.
x1 <- data.frame( name=c("a", "b", "c"), math=c(1, 2, 3) )
y1 <- data.frame( name=c("c", "b", "a"), english=c(4, 5, 6) )
merge(x1, y1, by.x='name', by.y='name')
merge(x1, y1)
# 양쪽의 공통된 컬럼을 이용하여 머지해준다.
# name math english
# 1 a 1 6
# 2 b 2 5
# 3 c 3 4
x2 <- data.frame( name=c("a", "b", "c"), math=c(1, 2, 3) )
y2 <- data.frame( name=c("a", "b", "d"), english=c(4, 5, 6) )
# 기본 값(all=FALSE 인자) : 공통된 항목만 보여 준다.
merge(x2, y2)
# name math english
# 1 a 1 4
# 2 b 2 5
# all=TRUE 인자 : 비어 있는 데이터는 NA가 추가된다.
merge(x2, y2, all=TRUE)
# name math english
# 1 a 1 4
# 2 b 2 5
# 3 c 3 NA
# 4 d NA 6
실행 결과
> x1 <- data.frame( name=c("a", "b", "c"), math=c(1, 2, 3) )
>
> y1 <- data.frame( name=c("c", "b", "a"), english=c(4, 5, 6) )
>
> merge(x1, y1, by.x='name', by.y='name')
name math english
1 a 1 6
2 b 2 5
3 c 3 4
>
> merge(x1, y1)
name math english
1 a 1 6
2 b 2 5
3 c 3 4
> # 양쪽의 공통된 컬럼을 이용하여 머지해준다.
> # name math english
> # 1 a 1 6
> # 2 b 2 5
> # 3 c 3 4
>
> x2 <- data.frame( name=c("a", "b", "c"), math=c(1, 2, 3) )
>
> y2 <- data.frame( name=c("a", "b", "d"), english=c(4, 5, 6) )
>
> # 기본 값(all=FALSE 인자) : 공통된 항목만 보여 준다.
> merge(x2, y2)
name math english
1 a 1 4
2 b 2 5
> # name math english
> # 1 a 1 4
> # 2 b 2 5
>
> # all=TRUE 인자 : 비어 있는 데이터는 NA가 추가된다.
> merge(x2, y2, all=TRUE)
name math english
1 a 1 4
2 b 2 5
3 c 3 NA
4 d NA 6
> # name math english
> # 1 a 1 4
> # 2 b 2 5
> # 3 c 3 NA
> # 4 d NA 6