R-Studio 데이터 join과 merge 그리고 plyr

R-Studio의 plyr패키지 를 이용하여 데이터를 join, merge한다.

Featured image

R-Studio 도 함수를 만들 수 있다.

plyr 를 이용하여 merge와 join을 사용하자!
파이프라인 함수 를 사용하기 위해 dplyr 로 필요합니다.
패키지 로드순서는 plyr -> dplyr 순서로 로드 해주시기 바랍니다.

파일 소스

우클릭 -> 다른이름으로 링크저장 이용해 주세요
member.csv
board.csv
2013년_프로야구선수_성적 (1).csv

사용 예시 소스코드

member <- read.csv("member.csv", header = T)
member
# 아이디     이름  급여       생일 성별 적립포인트
# 1    kim   김철수 50000 2017-02-16 남자        120
# 2   hong   홍길동 70000 2017-07-17 남자        160
# 3   park   박영희 80000 2017-08-15 여자        250
# 4   shin 신사임당 30000 2017-08-15 여자        250

board <- read.csv("board.csv", header = T)
board
# 일련번호       제목 아이디          글내용 조회수   작성일자
# 1        1  jsp어려워   hong   정말 어려워요      1 2017-07-02
# 2        2    어떤 글   hong 정말 호호호호호      2 2017-07-04
# 3        3 열공합시다   hong          멍멍멍      3 2017-07-12
# 4        4    어떤 글   park 정말 호호호호호      4 2017-07-16

# 속성구조 보기
colnames(member)
# [1] "아이디"     "이름"       "급여"       "생일"       "성별"       "적립포인트"
colnames(board)
# [1] "일련번호" "제목"     "아이디"   "글내용"   "조회수"   "작성일자"

# 라이브러리 조회
help(merge)

# merge(변수1, 변수2, by = "기준 컬럼명")
# 기본 Inner Join
result <- merge(member, board, by = "아이디")
result
# 아이디   이름  급여       생일 성별 적립포인트 일련번호       제목          글내용 조회수
# 1   hong 홍길동 70000 2017-07-17 남자        160        1  jsp어려워   정말 어려워요      1
# 2   hong 홍길동 70000 2017-07-17 남자        160        2    어떤 글 정말 호호호호호      2
# 3   hong 홍길동 70000 2017-07-17 남자        160        3 열공합시다          멍멍멍      3
# 4   park 박영희 80000 2017-08-15 여자        250        4    어떤 글 정말 호호호호호      4
# 작성일자
# 1 2017-07-02
# 2 2017-07-04
# 3 2017-07-12
# 4 2017-07-16

# Full Outter Join
result <- merge(member, board, by = "아이디", all = T)
result
# 아이디     이름  급여       생일 성별 적립포인트 일련번호       제목          글내용 조회수
# 1   hong   홍길동 70000 2017-07-17 남자        160        1  jsp어려워   정말 어려워요      1
# 2   hong   홍길동 70000 2017-07-17 남자        160        2    어떤 글 정말 호호호호호      2
# 3   hong   홍길동 70000 2017-07-17 남자        160        3 열공합시다          멍멍멍      3
# 4    kim   김철수 50000 2017-02-16 남자        120       NA       <NA>            <NA>     NA
# 5   park   박영희 80000 2017-08-15 여자        250        4    어떤 글 정말 호호호호호      4
# 6   shin 신사임당 30000 2017-08-15 여자        250       NA       <NA>            <NA>     NA
# 작성일자
# 1 2017-07-02
# 2 2017-07-04
# 3 2017-07-12
# 4       <NA>
#   5 2017-07-16
# 6       <NA>

library(plyr)
# 사용자 커스텀 라이브러리
# 이것도 조인 함수 이다.
# plyr은 기본 Left Outter Join 이다.
# Inner Join은 따로 인자 값을 줘야한다.
result <- join(member, board, by="아이디")
result
# 아이디     이름  급여       생일 성별 적립포인트 일련번호       제목          글내용 조회수
# 1    kim   김철수 50000 2017-02-16 남자        120       NA       <NA>            <NA>     NA
# 2   hong   홍길동 70000 2017-07-17 남자        160        1  jsp어려워   정말 어려워요      1
# 3   hong   홍길동 70000 2017-07-17 남자        160        2    어떤 글 정말 호호호호호      2
# 4   hong   홍길동 70000 2017-07-17 남자        160        3 열공합시다          멍멍멍      3
# 5   park   박영희 80000 2017-08-15 여자        250        4    어떤 글 정말 호호호호호      4
# 6   shin 신사임당 30000 2017-08-15 여자        250       NA       <NA>            <NA>     NA
# 작성일자
# 1       <NA>
#   2 2017-07-02
# 3 2017-07-04
# 4 2017-07-12
# 5 2017-07-16
# 6       <NA>


# Inner Join 인자값 전달 하기.
result <- join(member, board, by="아이디", type = "inner")
result
# 아이디   이름  급여       생일 성별 적립포인트 일련번호       제목          글내용 조회수
# 1   hong 홍길동 70000 2017-07-17 남자        160        1  jsp어려워   정말 어려워요      1
# 2   hong 홍길동 70000 2017-07-17 남자        160        2    어떤 글 정말 호호호호호      2
# 3   hong 홍길동 70000 2017-07-17 남자        160        3 열공합시다          멍멍멍      3
# 4   park 박영희 80000 2017-08-15 여자        250        4    어떤 글 정말 호호호호호      4
# 작성일자
# 1 2017-07-02
# 2 2017-07-04
# 3 2017-07-12
# 4 2017-07-16

# Full Outter Join
result <- join(member, board, by="아이디", type = "full")
result
# 아이디     이름  급여       생일 성별 적립포인트 일련번호       제목          글내용 조회수
# 1    kim   김철수 50000 2017-02-16 남자        120       NA       <NA>            <NA>     NA
# 2   hong   홍길동 70000 2017-07-17 남자        160        1  jsp어려워   정말 어려워요      1
# 3   hong   홍길동 70000 2017-07-17 남자        160        2    어떤 글 정말 호호호호호      2
# 4   hong   홍길동 70000 2017-07-17 남자        160        3 열공합시다          멍멍멍      3
# 5   park   박영희 80000 2017-08-15 여자        250        4    어떤 글 정말 호호호호호      4
# 6   shin 신사임당 30000 2017-08-15 여자        250       NA       <NA>            <NA>     NA
# 작성일자
# 1       <NA>
#   2 2017-07-02
# 3 2017-07-04
# 4 2017-07-12
# 5 2017-07-16
# 6       <NA>

# tapply(계산대상 컬럼, 그룹 대상컬럼, 연산함수(mean, sum 등...))
# 남자 여자를 그룹하여 급여 평균 도출
tapply(member$급여, member$성별, mean)
# 남자  여자 
# 60000 55000 

# 설병로 적립 포인트의 합
str(member) # 구조 출력
# 'data.frame':	4 obs. of  6 variables:
#   $ 아이디    : Factor w/ 4 levels "hong","kim","park",..: 2 1 3 4
# $ 이름      : Factor w/ 4 levels "김철수","박영희",..: 1 4 2 3
# $ 급여      : int  50000 70000 80000 30000
# $ 생일      : Factor w/ 3 levels "2017-02-16","2017-07-17",..: 1 2 3 3
# $ 성별      : Factor w/ 2 levels "남자","여자": 1 1 2 2
# $ 적립포인트: int  120 160 250 250
tapply(member$적립포인트, member$성별, sum)
# 남자 여자 
# 280  500 

# ddply(소스테이블, .(컬럼1, 컬럼2...), summarise, 유저변수=산술함수(컬럼), 유저변수=산술함수(컬럼))
result <- ddply(member, .(성별), summarise, meandata=mean(급여), sumdata=sum(급여))
result
# 성별 meandata sumdata
# 1 남자    60000  120000
# 2 여자    55000  110000

# summarise 와 transform 은 다른점은 summarise 는 연산결과만 나오고 transform은 연산결과를 원래 테이블에 적용 하여 샘플링하여 도출 시켜줌.
# 각 남녀 그룹별로 각 튜플이 차지하는 급여 퍼센트
result <- ddply(member, .(성별), transform, meandata=mean(급여), sumdata=sum(급여), percent=급여/sum(급여))
result
# 아이디     이름  급여       생일 성별 적립포인트 meandata sumdata   percent
# 1    kim   김철수 50000 2017-02-16 남자        120    60000  120000 0.4166667
# 2   hong   홍길동 70000 2017-07-17 남자        160    60000  120000 0.5833333
# 3   park   박영희 80000 2017-08-15 여자        250    55000  110000 0.7272727
# 4   shin 신사임당 30000 2017-08-15 여자        250    55000  110000 0.2727273

# 데이터가 문서에 담기에 너무 길어 직접 실행 해보기.
# dplyr 패키지 사용.
# install.packages("dplyr")
library(dplyr)

# 실습
data <- read.csv("2013년_프로야구선수_성적 (1).csv")
data
str(data)

# 필터 써보기.
data2 <- filter(data, 경기 >= 120)
data2

data3 <- filter(data, 경기 >= 120 & 득점 >= 80)
data3

# or 연산
# 포지션이 "1루수" 또는 "3루수"
data4 <- filter(data, 포지션=="1루수" | 포지션=="3루수")
data4

# %in% : in 연산자
data4 <- filter(data, 포지션 %in% c("1루수", "3루수"))
data4

# 컬럼 뽑아내기
# select 문 사용하기.
# select(테이블, c(컬럼1, 컬럼2, 컬럼3...))
data5 <- select(data, c("선수명", "포지션", "팀"))
data5

# 순위:타수 = 순위 컬럼 ~ 타수 컬럼까지 도출.
data6 <- select(data, 순위:타수)
data6

# 포지션이 1루수 또는 3루수인 선수들의 선수명, 포지션, 득점
# select where 절
userFilter <- filter(data, 포지션=="1루수" | 포지션=="3루수")
data7 <- select(userFilter, c("선수명", "포지션", "득점"))
data7

# %>% : 여러 개의 문장을 조합하여 사용하고자 할때
# Select 문을 %>% 연결 연산으로 바꿔씀
result <- data %>% filter(포지션=="1루수" | 포지션=="3루수") %>% select(c("선수명", "포지션", "득점"))
result

# data 에서 홈런과 타점 빼고 출력 해줌.
# vector에 -가 붙음.
data8 <- select(data, -c(홈런, 타점))
data8

# 선수 이름, 팀, 경기, 타수 조회
# 타수가 400이상
data9 <- data %>% filter(타수 >= 400) %>% select(c("선수명", "팀", "경기", "타수"))
data9

# arrange 는 오름차순 정렬 해줌.
data10 <- data %>% arrange(홈런)
data10

# desc(컬럼) 내림차순 해줌.
data11 <- data %>% arrange(desc(홈런))
data11

# %>% 연산을 하면서 컬럼이 파생되는데 필터먼저하고 정렬한후 나온 데이터를 가지고 select를 해야한다.
# select를 먼저 하면 홈런 칼럼이 없어서 문제가 생긴다.
data12 <- data %>% filter(타수 >= 400) %>% arrange(desc(홈런)) %>% select(c("선수명", "팀", "경기", "타수"))
data12

# mutate() 컬럼연산을 통해 컬럼을 생성
data13 <- data %>% select(c("선수명", "팀", "경기", "타수")) %>% mutate(결과 = 경기*타수)
data13

# "선수명", "팀", "경기", "타수", 루타의합
# 루타의합 = 1루타+2루타+3루타 
# 루타의합에 대하여 오름차 정렬렬

data14 <- data %>% mutate(루타의합 = 안타+X2루타+X3루타) %>% arrange(루타의합) %>% select(c("선수명", "팀", "경기", "타수"))
data14

# 팀별 평균 경기 수
# group_by랑 summarise 안에서는 쌍따옴표를 쓰면 안됨.
data[c("팀", "경기")]
data15 <- data %>% group_by() %>% summarise(average=mean(경기, na.rm = T))
data15

# summarise_each 함수 사용.
# 경기와 타수의 각각의 평균 구하기
data16 <- data %>% group_by() %>% summarise_each(list(mean), 경기, 타수)
data16

# 개수 확인
data17 <- data %>% group_by() %>% summarise_each(funs(mean, n()),경기, 타수)
data17

colnames(data)