plyr 패키지
: 두개 이상의 데이터프레임을 대상으로 key 값을 이용하여 하나의 패키지로 병합(merge) 하거나,
집단 변수를 기준으로 데이터 프레임의 변수에 함수를 적용하여 요약집계 결과를 제공하는 패키지입니다.
1) join 의 기능
① 데이터 병합
x <- data.frame(id = c(1,2,3,4,5), height = c(160,171,173,162,165))
y <- data.frame(id = c(5,4,1,3,2), weight = c(55,73,60,57,80))
x;y
- 출력값 -
id height
1 160
2 171
3 173
4 162
5 165
id weight
5 55
4 73
1 60
3 57
2 80
z <- join(x,y, by = 'id') # by = 'id' 공통인 id를 기준으로 데이터 병합
z
- 출력값 -
id height weight
1 160 60
2 171 80
3 173 57
4 162 73
5 165 55
- 순서가 다르게 저장되어 있어도 정렬하여 출력합니다.
# merge와 join 같은 결과값을 낸다
a <- merge(x,y,by= 'id') # by = 'id' 공통인 id를 기준으로 데이터 병합
a
- 출력값 -
id height weight
1 160 60
2 171 80
3 173 57
4 162 73
5 165 55
merge와 같은 기능을 가지고 있는데 왜 join을 사용할까요?
그 이유는 추가적인 기능을 많이 가지고 있기 때문입니다. 그 기능을 조금 더 알아보겠습니다.
② 왼쪽(left) 조인하기
- x, y 의 데이터에서 6과 5 다른 값으로 저장 되어 있는 상황
x <- data.frame(id = c(1,2,3,4,6), height = c(160,171,173,162,165))
y <- data.frame(id = c(5,4,1,3,2), weight = c(55,73,60,57,80))
left <-join( x , y , by = 'id')
left
- 출력값 -
id height weight
1 160 60
2 171 80
3 173 57
4 162 73
6 165 NA
- by = 'id' 공통인 id를 기준으로 데이터 병합합니다.
- 왼쪽 조인 방법이 default 값으로, 왼쪽 변수를 기준으로 하여 삽입 되어 있는 값이 없으면 NA(결측치)를 반환합니다.
(왼쪽변수 기준 : NA(결측치;누락된 값, 비어있는 값))
② 내부(inner) 조인
x <- data.frame(id = c(1,2,3,4,6), height = c(160,171,173,162,165))
y <- data.frame(id = c(5,4,1,3,2), weight = c(55,73,60,57,80))
inner <-join( x , y , by = 'id' , type = 'inner')
inner
- 출력값 -
id height weight
1 160 60
2 171 80
3 173 57
4 162 73
type='inner' : 값이 있는 것만 조인합니다. - default 값을 변경 하고 싶을 때 type 사용
③ 전체(full) 조인하기
x <- data.frame(id = c(1,2,3,4,6), height = c(160,171,173,162,165))
y <- data.frame(id = c(5,4,1,3,2), weight = c(55,73,60,57,80))
full <-join( x , y , by = 'id' , type = 'full')
full
- 출력값 -
id height weight
1 160 60
2 171 80
3 173 57
4 162 73
6 165 NA
5 NA 55
type ='full' : 모든 항목 조인합니다.
- id의 순서는 먼저 오는 데이터 순으로 입력 됩니다.
④ key 값으로 병합하기
x <- data.frame(key1 = c(1,1,2,2,3) ,
key2 = c('a', 'b' , 'c' , 'd', 'e'), val1 = c(10,20,30,40,50))
y <- data.frame(key1 = c(3,2,2,1,1) ,
key2 = c('e', 'd' , 'c' , 'b', 'a'), val1 = c(500,400,300,200,100))
xy <- join(x,y,by=c('key1','key2'))
xy
- 출력값 -
key1 key2 val1 val1
1 a 10 100
1 b 20 200
2 c 30 300
2 d 40 400
3 e 50 500
tapply()
: 이용한 집단별(그룹별) 통계치 구하기(활용도높음)
iris 데이터 셋을 대상을 tupply() 함수 적용해보겠습니다.
< iris >
R에서 제공되는 기본 데이터 셋으로 3가지 꽃의 종류별 50 개씩 전체 150개의 관측치로 구성됩니다. iris는 붓꽃에 관한 데이터 5개의 변수로 제공하며, 각 변수의 내용은 다음과 같습니다.
Sepal.Length(꽃받침 길이) , Sepal.Width(꽃받침 너비), Petal.Length(꽃잎 길이),
Petal.Width(꽃잎 너비), Species(꽃의 종류) : 3가지 종류별 50개 (전체 150개 관측치)
tapply(iris$Sepal.Length, iris$Species, mean) # 평균
- 출력값 -
setosa versicolor virginica
5.006 5.936 6.588
tapply(iris$Sepal.Length, iris$Species, sd # 표준편차(sd)
- 출력값 -
setosa versicolor virginica
0.3524897 0.5161711 0.6358796
데이터 셋 <꽃받침의 길이>, 그룹핑할 데이터 셋 <종(3가지를 그룹핑을 함)>, 기능(함수)
ddply()
: 집단 변수 대상 통계치 구하기
형식) ddply(dataframe, .(집단변수), 요약집계, 컬럼명=함수(변수))
설명) dataframe의 집단변수를 기준으로 변수에 함수를 적용하여 컬럼명으로 표현합니다.
- tapply 와 차이점 추가적으로 여러개의 값을 출력할 수 있습니다.
avg_df <- ddply(iris, .(Species), summarise, avg = mean(Sepal.Length))
avg_df
- 출력값 -
Species avg
setosa 5.006
versicolor 5.936
virginica 6.588
# 꽃의 종(Species)으로 여러 개의 함수 적용하기
val <- ddply(iris, .(Species), summarise, avg = mean(Sepal.Length),
std =sd(Sepal.Length),
max = max(Sepal.Length),
min = min(Sepal.Length))
val
- 출력값 -
Species avg std max min
setosa 5.006 0.3524897 5.8 4.3
versicolor 5.936 0.5161711 7.0 4.9
virginica 6.588 0.6358796 7.9 4.9
# 결과값의 단위가 다르므로 같도로 처리.
round <- ddply(iris, .(Species), summarise, avg = round(mean(Sepal.Length),2),
std = round(sd(Sepal.Length),2),
max = round(max(Sepal.Length),2),
min = round(min(Sepal.Length),2))
round # 소수점 둘째 자리까지 출력.
- 출력값 -
Species avg std max min
setosa 5.01 0.35 5.8 4.3
versicolor 5.94 0.52 7.0 4.9
virginica 6.59 0.64 7.9 4.9
round() : 반올림 처리하기 .