본문 바로가기
ADP

데이터 결합 및 요약

by forestlim 2021. 1. 2.
728x90
반응형

모형에 적용할 데이터를 만들기 위해 서로 다른 여러 개의 데이터를 결합하는 과정이 필요할 수 있다. 이 같이 데이터 결합과 요약에 사용될 수 있는 유용한 함수들을 알아보자!

 

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

 

728x90
반응형

'ADP' 카테고리의 다른 글

주성분분석(PCA)  (0) 2020.12.31

댓글