> 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 계열 함수 - 집계함수>
'R > Data Operation' 카테고리의 다른 글
R 내장데이터셋 Built-in Dataset - attach/detach (0) | 2020.12.12 |
---|---|
R 데이터 분리, 병합, 정렬 - split/subset/merge/sort/order (0) | 2020.12.05 |
R apply 계열 함수/replicate/sweep/aggregate (0) | 2020.11.16 |
R 벡터 Vector 관련 내장함수 (0) | 2020.11.10 |
R 산술/관계/비교/논리연산자와 벡터연산 (0) | 2020.11.05 |
댓글