모형에 적용할 데이터를 만들기 위해 서로 다른 여러 개의 데이터를 결합하는 과정이 필요할 수 있다. 이 같이 데이터 결합과 요약에 사용될 수 있는 유용한 함수들을 알아보자!
1. 데이터 결합
1) rbind
- 행을 서로 결합
- rbind를 사용할 때는 결합하고자 하는 데이터의 열 이름과 개수가 동일해야 한다는 점
> customer1<-data.frame(id=c('c01','c02','c03','c04'),
+ last_name=c("Lee","Kim","Choi","Park"))
> customer2<-data.frame(id=c('c05','c06','c07'),
+ last_name=c('Lim','Bae','Kim'))
> customer1
id last_name
1 c01 Lee
2 c02 Kim
3 c03 Choi
4 c04 Park
> id_name<-rbind(customer1, customer2)
> id_name
id last_name
1 c01 Lee
2 c02 Kim
3 c03 Choi
4 c04 Park
5 c05 Lim
6 c06 Bae
7 c07 Kim
2) cbind
- 열을 서로 결합
- cbind를 사용할 때는 결합하고자 하는 데이터의 행 개수가 동일해야 한다는 점
> age_income<-data.frame(age=c(20,25,37,40,32,45,37),
+ income=c(2500,6400,0,7000,3400,3800,5010))
> customer<-cbind(id_name, age_income)
> customer
id last_name age income
1 c01 Lee 20 2500
2 c02 Kim 25 6400
3 c03 Choi 37 0
4 c04 Park 40 7000
5 c05 Lim 32 3400
6 c06 Bae 45 3800
7 c07 Kim 37 5010
3) merge
-두 데이터프레임에서 기준이 되는 특정 칼럼의 값이 같은 행끼리 묶어 병합
- merge(x,y,by,by.x,by.y,all=FALSE,all.x, all.y)
ex) 고객의 아이디(id), 이름(name)으로 이루어진 데이터프레임(id_name)과 고객의 아이디(id), 번호(number)로 이루어진 데이터프레임(id_number)을 생성한 뒤, 다양한 방법으로 두 데이터를 병합
> # 병합에 사용할 데이터 프레임 생성
> id_name<-data.frame(id=c('c01','c02','c03','c04','c05','c06','c07'),
+ last_name=c('Lee','Kim','Choi','Park','Lim','Bae','Kim'))
> id_number<-data.frame(id=c('c03','c04','c05','c06','c07','c08','c09'),
+ number=c(3,1,0,7,3,4,1))
> # id_name, id_number 데이터 프레임 확인
> id_name
id last_name
1 c01 Lee
2 c02 Kim
3 c03 Choi
4 c04 Park
5 c05 Lim
6 c06 Bae
7 c07 Kim
> id_number
id number
1 c03 3
2 c04 1
3 c05 0
4 c06 7
5 c07 3
6 c08 4
7 c09 1
Q1) id 칼럼을 기준으로 두 테이블이 모두 공통된 값을 가지고 있는 경우에만 두 데이터(id_name, id_number)를 비교
(데이터 베이스의 InnerJoin에 해당)
> merge(id_name,id_number,by='id')
id last_name number
1 c03 Choi 3
2 c04 Park 1
3 c05 Lim 0
4 c06 Bae 7
5 c07 Kim 3
Q2) 공통된 값이 없는 경우에도 데이터가 출력되도록 id칼럼을 기준으로 두 데이터(id_name, id_number)의 모든 행 병합(데이터 베이스의 OuterJoin에 해당)
> merge(id_name, id_number,by='id',all=T)
id last_name number
1 c01 Lee NA
2 c02 Kim NA
3 c03 Choi 3
4 c04 Park 1
5 c05 Lim 0
6 c06 Bae 7
7 c07 Kim 3
8 c08 <NA> 4
9 c09 <NA> 1
Q3) id 칼럼을 기준으로 두 데이터(id_name, id_number)를 병합하는데, 기준 칼럼에 공통 값이 없는 경우에는 id_name 데이터를 기준으로 병합(데이터베이스의 LeftOuterJoin에 해당)
> merge(id_name,id_number,by='id',all.x=T)
id last_name number
1 c01 Lee NA
2 c02 Kim NA
3 c03 Choi 3
4 c04 Park 1
5 c05 Lim 0
6 c06 Bae 7
7 c07 Kim 3
Q4) id 칼럼을 기준으로 두 데이터(id_name, id_number)를 병합하는데, 기준 칼럼에 공통 값이 없는 경우에는 id_number 데이터를 기준으로 병합(데이터베이스의 RightOuterJoin에 해당)
> merge(id_name, id_number,by='id',all.y=T)
id last_name number
1 c03 Choi 3
2 c04 Park 1
3 c05 Lim 0
4 c06 Bae 7
5 c07 Kim 3
6 c08 <NA> 4
7 c09 <NA> 1
2. 데이터 요약
1) aggregate
- 특정 칼럼을 기준으로 데이터를 그룹지어 집계함수를 적용
- aggregate(x,by,FUN)
- aggregate(formula,data,FUN)
<예제>
Q1) iris 데이터에서 종별 Sepal.Width의 평균을 구해보기
> aggregate(Sepal.Width~Species, iris,mean)
Species Sepal.Width
1 setosa 3.428
2 versicolor 2.770
3 virginica 2.974
Q2) iris데이터에서 종별 Sepal.Width와 Petal.Width 의 평균을 구해보기
(cbind로 Sepal.Width 와 Petal.Width 묶기)
> aggregate(cbind(Sepal.Width, Petal.Width)~Species, iris,mean)
Species Sepal.Width Petal.Width
1 setosa 3.428 0.246
2 versicolor 2.770 1.326
3 virginica 2.974 2.026
2) table
- 범주형 변수에 대해서 각 범주별 도수를 알기 위해 도수분포표를 만들 때 table함수 이용
<예제>
Q1) Titanic 데이터에서 좌석등급을 의미하는 Class변수에 대해서 도수분포표를 생성
> Titanic<-as.data.frame(Titanic)
> Titanic
Class Sex Age Survived Freq
1 1st Male Child No 0
2 2nd Male Child No 0
3 3rd Male Child No 35
4 Crew Male Child No 0
5 1st Female Child No 0
6 2nd Female Child No 0
7 3rd Female Child No 17
> str(Titanic)
'data.frame': 32 obs. of 5 variables:
$ Class : Factor w/ 4 levels "1st","2nd","3rd",..: 1 2 3 4 1 2 3 4 1 2 ...
$ Sex : Factor w/ 2 levels "Male","Female": 1 1 1 1 2 2 2 2 1 1 ...
$ Age : Factor w/ 2 levels "Child","Adult": 1 1 1 1 1 1 1 1 2 2 ...
$ Survived: Factor w/ 2 levels "No","Yes": 1 1 1 1 1 1 1 1 1 1 ...
$ Freq : num 0 0 35 0 0 0 17 0 118 154 ...
> table(Titanic$Class)
1st 2nd 3rd Crew
8 8 8 8
Q2) 내장데이터 Titanic에서 Survived변수는 승객의 생존여부를 의미. 좌석등급과 생존여부의 관계를 살펴보기 위해 Class변수에 따른 Survived변수의 도수를 표 형태로 나타내보기
> table(Titanic$Class, Titanic$Survived)
No Yes
1st 4 4
2nd 4 4
3rd 4 4
Crew 4 4
3) prop.table
-범주형 변수에 대한 상대도수(비율)를 알고자 할 때
- prop.table(table객체, 1) - 행별 상대도수 파악
- prop.table(table객체, 2) - 열별 상대도수 파악
<예제>
Q1) Age변수에 따른 생존여부의 관계를 전체에 대한 비율, 행별 비율, 열별 비율로 살펴보기
> prop.table(table(Titanic$Age, Titanic$Survived))
No Yes
Child 0.25 0.25
Adult 0.25 0.25
> prop.table(table(Titanic$Age, Titanic$Survived),1)
No Yes
Child 0.5 0.5
Adult 0.5 0.5
> prop.table(table(Titanic$Age, Titanic$Survived),2)
No Yes
Child 0.5 0.5
Adult 0.5 0.5
4) subset
- 전체 데이터에서 특정 조건을 만족하는 값들만 추출할 때는 subset함수 사용
<예제>
Q1) iris에서 Species가 Setosa 이면서, Sepal.Length 가 5.5 초과인 데이터들의 Species, Sepal.Length 변수값만 조회
> subset(iris, subset=(Species=='setosa'&Sepal.Length>5.5), select=c(Species, Sepal.Length))
Species Sepal.Length
15 setosa 5.8
16 setosa 5.7
19 setosa 5.7
> subset(iris, subset=(Species=='setosa'&Sepal.Length>5.5))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species SL_new
15 5.8 4.0 1.2 0.2 setosa 0.4166667
16 5.7 4.4 1.5 0.4 setosa 0.3888889
19 5.7 3.8 1.7 0.3 setosa 0.3888889
'ADP' 카테고리의 다른 글
주성분분석(PCA) (0) | 2020.12.31 |
---|
댓글