본문 바로가기
R/Data Operation

R table 계열 함수 - 집계함수

by 통계열등생 2020. 11. 26.
반응형
> a = c('Kim', 'Lee', 'Park', 'Lee', 'Park', 'Kim', 'Kim')
> b = c('M', 'F', 'M', 'F', 'M', 'F', 'M')
> c = c('A', 'B', 'A', 'B', 'O', 'O', 'B')
> df = data.frame(name=a, gender=b, blood=c)
> df
  name gender blood
1  Kim      M     A
2  Lee      F     B
3 Park      M     A
4  Lee      F     B
5 Park      M     O
6  Kim      F     O
7  Kim      M     B

이름, 성별, 혈액형으로 구성되는 정보를 데이터프레임으로 만들어 이를 이용해 집계함수를 설명하려 한다.

 

 

 

 ◎ table()

 

table( ... , exclude = if (useNA == "no") c(NA, NaN), useNA = c("no", "ifany", "always"),
      dnn = list.names(...), deparse.level = 1)

<인수설명>

exclude  객체들의 요인에서 제거할 수준을 지정
useNA  테이블에 NA 값을 포함할지 여부를 지정
dnn  집계된 결과의 차원에 부여 할 이름 
deparse.level dnn이 구성되는 방법을 제어

 

> table(df$name)

 Kim  Lee Park 
   3    2    2 
> table(df$name, df$blood)
      
       A B O
  Kim  1 1 1
  Lee  0 2 0
  Park 1 0 1
> table(df$name, df$blood, df$gender)
, ,  = F

      
       A B O
  Kim  0 0 1
  Lee  0 2 0
  Park 0 0 0

, ,  = M

      
       A B O
  Kim  1 1 0
  Lee  0 0 0
  Park 1 0 1

table() 함수는 각 요인의 수준별 도수에 대한 집계표를 작성한다.

요인이 3개 이상이면 마지막 요인으로 분리되는 여러 개의 2차원 집계표가 만들어 진다.

 

> a = letters[1:3]
> a
[1] "a" "b" "c"
> sample(a)
[1] "a" "c" "b"
> table(a, sample(a))                    
   
a   a b c
  a 0 1 0
  b 1 0 0
  c 0 0 1

집계표의 행이름과 열이름을 지정할 수 있는 table() 함수의 인수는 dnn과 deparse.level이 있다.

deparse.level은 기본값으로 1이 지정되어있으므로 행이름만 출력된다. deparse.level=0은 행이름과 열이름 둘다 출력하지 않는 것이고, deparse.level=2는 행이름과 열이름 둘다 출력하는 것이다.

dnn 인수를 사용해 이름을 지정하려면 c() 함수를 사용하면 된다. 이에 대한 예제는 아래 코드블럭이다.

 

> table(a, sample(a), deparse.level = 0)
   
    a b c
  a 1 0 0
  b 0 1 0
  c 0 0 1
> table(a, sample(a), deparse.level = 2)
   sample(a)
a   a b c
  a 0 1 0
  b 1 0 0
  c 0 0 1
> table(a, sample(a), dnn=c("","열이름")) 
   열이름
    a b c
  a 1 0 0
  b 0 0 1
  c 0 1 0

 

 

 

 ◎ ftable()

 

ftable( ... , exclude = c(NA, NaN), row.vars = NULL, col.vars = NULL)

<인수설명>

exclude  객체들의 요인에서 제거할 수준을 지정
row.vars 변수의 개수를 제공하는 정수 벡터이거나, 집계표의 행에 사 용될 변수의 이름 벡터
col.vars 변수의 개수를 제공하는 정수 벡터이거나, 집계표의 열에 사 용될 변수의 이름 벡터

 

> ftable(df$name, df$blood)
      A B O
           
Kim   1 1 1
Lee   0 2 0
Park  1 0 1
> ftable(df)
            blood A B O
name gender            
Kim  F            0 0 1
     M            1 1 0
Lee  F            0 2 0
     M            0 0 0
Park F            0 0 0
     M            1 0 1

ftable() 함수는 범주형 자료의 요인에서 각 레벨별 도수에 대한 다차원 집계표를 작성한다.

요인이 1~2개일 때는 table() 함수의 결과와 같지만 요인이 3개 이상일 때에는 하나의 집계표가 작성된다.

 

> ftable(df, row.vars=c(2,3), col.vars=1)
             name Kim Lee Park
gender blood                  
F      A            0   0    0
       B            0   2    0
       O            1   0    0
M      A            1   0    1
       B            1   0    0
       O            0   0    1

row.vars와 col.vars 인수를 사용해 행에 들어갈 변수와 열에 들어갈 변수를 지정할 수 있다. 

데이터프레임의 인덱스뿐만아니라 변수의 이름으로 지정할 수도 있다.

 

 

 

 ◎ margin.table()

 

margin.table(x, margin = NULL)

<인수설명>

x 배열, 집계표
margin  인덱스 번호 (1은 행, 2는 열)

 

> tb = table(df$gender, df$blood)
> tb
   
    A B O
  F 0 2 1
  M 2 1 1
> margin.table(tb)
[1] 7
> margin.table(tb, 1)

F M 
3 4 
> margin.table(tb, 2)

A B O 
2 3 2 

margin.table() 함수는 집계표에서 행 or 열에 대한 합계를 구한다.

성별, 혈액형 요인의 집계표를 변수에 저장한 후 margin.table() 함수의 첫번째 인수에 넣어주고, 두번째 인수에 1은 행, 2는 열, 지정하지 않으면 집계표 전체에 대한 합계를 구한다.

 

 

 

 ◎ prop.table()

 

prop.table(x, margin = NULL)

<인수설명>

x 배열, 집계표
margin  인덱스 번호 (1은 행, 2는 열)

 

> tb = table(df$gender, df$blood)
> tb
   
    A B O
  F 0 2 1
  M 2 1 1
> prop.table(tb) 
   
            A         B         O
  F 0.0000000 0.2857143 0.1428571
  M 0.2857143 0.1428571 0.1428571
> prop.table(tb, 1)
   
            A         B         O
  F 0.0000000 0.6666667 0.3333333
  M 0.5000000 0.2500000 0.2500000
> prop.table(tb, 2)
   
            A         B         O
  F 0.0000000 0.6666667 0.5000000
  M 1.0000000 0.3333333 0.5000000

prop.table() 함수는 집계표에서 행 or 열에 대한 상대도수를 구한다.

margin.table() 함수처럼 성별, 혈액형 요인의 집계표를 변수에 저장한 후 첫번째 인수에 넣어주고, 두번째 인수는 1은 행, 2는 열 or 지정하지 않을 수 있다.

두번째 인수를 지정하지 않으면 집계표에서 각 빈도의 총합은 7이므로 총합에 대한 각 빈도수의 상대도수를 구한다.

 

 

 

 ◎ xtabs()

 

xtabs(formula = ~., data = parent.frame(), subset, sparse = FALSE,
       na.action, addNA = FALSE, exclude = if(!addNA) c(NA, NaN),
       drop.unused.levels = FALSE)

<인수설명>

formula  집계의 방법을 정의한 수식 
data  데이터 프레임이나 행렬 
subset 집계를 위한 대상의 부분집합
exclude  집계에서 제외할 수준

 

> new_df = data.frame(df, cnt=c(3,2,5,7,4,8,1))
> new_df
  name gender blood cnt
1  Kim      M     A   3
2  Lee      F     B   2
3 Park      M     A   5
4  Lee      F     B   7
5 Park      M     O   4
6  Kim      F     O   8
7  Kim      M     B   1

기존 데이터프레임에 가족의 수가 저장된 cnt 변수를 추가하였다.

xtabs() 함수는 포뮬라(formula)를 이용하여 데이터프레임에서 집계표를 구한다.

 

> xtabs( ~ gender, new_df) 
gender
F M 
3 4 
> xtabs( ~ new_df$gender)
new_df$gender
F M 
3 4 

xtabs() 함수는 집계표를 만들 때 요인을 ~ 다음에 기술한다.

데이터프레임은 data 인수부분에 넣거나 달러사인($)을 사용해 표현해줄 수 있다.

 

> xtabs( ~ gender+blood, new_df)
      blood
gender A B O
     F 0 2 1
     M 2 1 1
> xtabs(cnt ~ gender, new_df)
gender
 F  M 
17 13 
> xtabs(cnt ~ gender+blood, new_df)
      blood
gender A B O
     F 0 9 8
     M 8 1 4

요인이 2개 이상일 때는 ~ 오른쪽에 + 기호를 사용하여 요인 이름을 열거한다.

~ 왼쪽에 문자형 변수는 들어갈 수 없다. cnt 변수를 ~ 왼쪽에 기술하면 빈도수가 아닌 가족 수에 대한 집계표가 작성된다. cnt ~ gender+blood 같은 경우는 성별과 혈액형에 대한 가족 수의 집계표이다.

 

> xtabs(cnt ~ gender+blood, new_df, subset=gender=='M')
      blood
gender A B O
     M 8 1 4

subset 인수에 조건식을 사용하여 집계표를 원하는대로 바꿀 수도 있다.

 

> xtabs(cnt ~ ., new_df) 
, , blood = A

      gender
name   F M
  Kim  0 3
  Lee  0 0
  Park 0 5

, , blood = B

      gender
name   F M
  Kim  0 1
  Lee  9 0
  Park 0 0

, , blood = O

      gender
name   F M
  Kim  8 0
  Lee  0 0
  Park 0 4

~ 오른쪽에 온점(.)을 넣으면 왼쪽에 기술된 cnt 변수를 제외한 모든 변수가 기술된 것과 같다. 순서는 데이터프레임의 인덱스 순서이다.

 

 

 

 

 

<R table 계열 함수 - 집계함수>

반응형

댓글