14. plyr 패키지
in Study on R Programming
Overview
R에서 plyr 패키지의 함수를 알아본다.
예제 파일 : member06.txt
plyr 패키지 실습
# ********************************************
# merge는 데이터 프레임을 결합해준다.
# 칼럼 값으로 기준으로 두 개의 프레임을 연결해준다.
# 양쪽 데이터에 기준 컬럼이 모두 존재하는 항목만 병합된다.
# ********************************************
df_kor = data.frame(id=c(1,2,3), kor = c(95,90,75))
df_eng = data.frame(id=c(1,2,4), eng = c(80,75,88))
df_kor
df_eng
# merge : inner join(공통된 것만 합침)
df_user = merge(df_kor, df_eng, by.x="id", by.y="id")
df_user
# all=TRUE : outer join
df_user <- merge(df_kor, df_eng, by.x='id', by.y='id', all=TRUE)
df_user
class(df_user) # 병합된 결과는 데이터 프레임이다.
# [1] "data.frame"
# ********************************************
# -- plyr 패키지 활용 - 데이터 조인
# ********************************************
# install.packages('plyr')
library(plyr) # 패키지 로딩
# 병합할 데이터 프레임 셋 만들기
# 공통된 컬럼 id의 요소들이 동일한 경우
data1 = data.frame(id = c(1,2,3,4,5), kor = c(60,75,80,60,70))
data2 = data.frame(id = c(5,4,1,3,2), eng = c(55,73,60,55,80))
data1
data2
# join() : plyr 패키지 제공 함수
# 공통된 컬럼을 by에 명시하면 된다.
result = join(data1, data2, by='id')
result
# 공통된 컬럼 id의 요소들이 동일하지 않는 경우
# 예를 들어서 data1의 id에는 숫자 7이 없다.
data1 = data.frame(id = c(1,2,3,4,6), kor = c(60,75,80,60,70))
data2 = data.frame(id = c(5,4,1,3,7), eng = c(55,73,60,55,80))
data1
data2
# -- inner/outer/full 조인
# id 컬럼으로 left 조인(왼쪽 변수 기준)
result = join(data1, data2, by='id')
result
# type='inner' : 값이 있는 것만 조인
result = join(data1, data2, by='id', type='inner')
result
# type='full' : 모든 항목 조인
result = join(data1, data2, by='id', type='full')
result
# -- 2개 이상의 컬럼으로 병합하기
data1 = data.frame(key1 = c(1,1,2,2,3), key2 = c('a','b','c','d','f'), val1 = c(10,20,30,40,50))
data2 = data.frame(key1 = c(3,2,2,1,1), key2 = c('e','d','c','b','a'), val2 = c(500,400,300,200,100))
data1
data2
result <- join(data1, data2, by=c('key1', 'key2'))
result
result <- join(data1, data2, type='inner', by=c('key1', 'key2'))
result
df_kor <- data.frame(id=c(1, 1, 2), kor=c(95, 90, 75))
df_eng <- data.frame(id=c(1, 2, 2), eng=c(80, 75, 88))
df_kor
df_eng
# match='first' : 왼쪽을 기준으로 매치되는 것 중에서 한개만 챙긴다.
result <- join(df_kor, df_eng, by='id', match='first')
result
result <- join(df_kor, df_eng, by='id',match='all')
result
# ********************************************
# -- tapply() - 그룹별 통계 구하기
# 형식) tapply(적용data, 집단변수, 함수)
# 집단변수 = 범주형 변수 (ex: gender)
# DB에서 group by를 통한 통계 함수 사용과 유사
# ********************************************
# ddply(data, 기준컬럼, 적용할함수)
member06 <- read.csv('member06.txt', header=T)
member06
tapply(member06$키, member06$성별, mean)
# ddply(data, 기준컬럼, 적용할함수)
result <- ddply(member06, .(성별), summarise, meanHeight=mean(키), sumWeight=sum(몸무게))
result
head(iris)
iris$Sepal.Width
# -- 꽃의 종류와 종류별 건수 구하기
table(iris$Species)
# -- 꽃의 종류별(Species) 꽃받침 길이 평균 구하기
tapply(iris$Sepal.Length, iris$Species, mean)
# -- 꽃의 종류별(Species) 꽃받침 길이 합계
tapply(iris$Sepal.Width, iris$Species, sum)
# ********************************************
# -- ddply() - 그룹별 여러 통계 구하기
# plyr 패키지 제공 함수
# 형식) ddply(dataframe, .(집단변수), 요약집계, 컬럼명=함수(변수))
# ********************************************
# 꽃의 종류별(Species)로 꽃받침 길이(Sepal.Length)의 평균 계산
# var : 분산
# .() : 그룹핑할 컬럼
a = ddply(iris, .(Species), summarise,
avg = mean(Sepal.Length),
tot = sum(Sepal.Length),
var = var(Sepal.Length))
a
# 결과 :
# Species avg tot var
# 1 setosa 5.006 250.3 0.1242490
# 2 versicolor 5.936 296.8 0.2664327
# 3 virginica 6.588 329.4 0.4043429