14. plyr 패키지


r

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





© 2019. by RaP0d

Powered by aiden