14 min to read
R-Studio 데이터 join과 merge 그리고 plyr
R-Studio의 plyr패키지 를 이용하여 데이터를 join, merge한다.
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)
Comments