Chapter 4. 다양한함수로데이터가공하기 진수쌤
[ 과정주요학습내용정리 ] 1. 기본함수로데이터제어하기 2. aggregate( ) 함수로데이터제어하기 3. apply( ) 계열의함수를사용하여데이터제어하기 4. plyr( ) 계열의함수와 dplyr( ) 함수를사용하기 5. stringr( ) 패키지와 reshape2( ), tidyr( ) 함수사용하기 6. 원하는함수를직접만들어사용하기
1. 많이사용되는기본함수들 함수 aggregate( ) apply( ) cor( ) cumsum( ) cumprom( ) diff( ) length( ) max( ) min( ) mean( ) median( ) order( ) prod( ) 의미다양한함수를사용하여계산결과를출력함다양한기능이있어서아래예를참고하세요상관함수설정된지점까지의누적합설정된지점까지의누적곱차이나는부분을찾아냄요소갯수를구해서출력함최대값을출력함최소값을출력함평균값을출력함가운데값을출력함각요소의원래위치누적곱을출력함
함수 의미 range( ) rank( ) rev( ) sd( ) sort( ) sum( ) summary( ) sweep( ) tapply( ) var( ) 범위값을출력함각요소의순위를출력함요소의역순을출력함표준편차를출력함정렬결과를출력함총합을출력함요약통계량을출력함일괄적으로주어진데이터를빼기함벡터에서주어진함수연산을수행함분산값을출력함
1) 기본함수들 > vec1 <- c(1,2,3,4,5) <-- 벡터에숫자를할당합니다 > vec2 <- c('a','b','c','d','e') <-- 벡터에문자를할당합니다 > max(vec1) <-- 숫자의최대값을구합니다 [1] 5 > max(vec2) <-- 문자의최대값을구합니다. [1] "e" > mean(vec1) <-- 평균값을찾습니다. [1] 3 > mean(vec2) <-- 문자벡터에서평균값을찾으라고하니에러가나옵니다. [1] NA 경고메시지 : In mean.default(vec2) : 인자가수치형또는논리형이아니므로 NA 를반환합니다 > min(vec1) <-- 최소값을찾습니다 [1] 1 > sd(vec1) <-- 표준편차를구해줍니다. 표준편차는아주중요한개념입니다. [1] 1.581139 > sum(vec1) <-- 합계를구해줍니다. [1] 15 > var(vec1) <-- 분산을구해줍니다. 분산도아주중요한개념입니다. [1] 2.5
2) aggregate 함수 집계하여주어진함수값구하기 문법 : aggregate( 계산될컬럼 ~ 기준될컬럼, 데이터, 함수 ) > install.packages("googlevis") > library(googlevis) > Fruits Fruit Year Location Sales Expenses Profit Date 1 Apples 2008 West 98 78 20 2008-12-31 2 Apples 2009 West 111 79 32 2009-12-31 3 Apples 2010 West 89 76 13 2010-12-31 4 Oranges 2008 East 96 81 15 2008-12-31 5 Bananas 2008 East 85 76 9 2008-12-31 6 Oranges 2009 East 93 80 13 2009-12-31 7 Bananas 2009 East 94 78 16 2009-12-31 8 Oranges 2010 East 98 91 7 2010-12-31 9 Bananas 2010 East 81 71 10 2010-12-31
> Fruits aggregate(sales~year, Fruits, sum) <-- Year 별로 Sales 된수량을 sum 해라! Fruit Year Location Sales Expenses Profit Date 1 Apples 2008 West 98 78 20 2008-12-31 2 Apples 2009 West 111 79 32 2009-12-31 3 Apples 2010 West 89 76 13 2010-12-31 4 Oranges 2008 East 96 81 15 2008-12-31 5 Bananas 2008 East 85 76 9 2008-12-31 6 Oranges 2009 East 93 80 13 2009-12-31 7 Bananas 2009 East 94 78 16 2009-12-31 8 Oranges 2010 East 98 91 7 2010-12-31 9 Bananas 2010 East 81 71 10 2010-12-31 2008 년 2009 년 2010 년
> aggregate(sales~year,fruits,sum) <-- 년도별로 Sales 된수량을 sum 한결과 Year Sales 1 2008 279 2 2009 298 3 2010 268 > aggregate(sales~fruit,fruits,sum) <- Fruit 별로 Sales 된수량을 sum 한결과 Fruit Sales 1 Apples 298 2 Bananas 260 3 Oranges 287
> aggregate(sales~fruit,fruits,max) <-- Fruit 별로가장많이 Sales 된수량 Fruit Sales 1 Apples 111 2 Bananas 94 3 Oranges 98 > aggregate(sales~fruit+year,fruits,max) <-- '+ 추가조건 ' 형태로조건을추가 Fruit Year Sales 1 Apples 2008 98 2 Bananas 2008 85 3 Oranges 2008 96 4 Apples 2009 111 5 Bananas 2009 94 6 Oranges 2009 93 7 Apples 2010 89 8 Bananas 2010 81 9 Oranges 2010 98
[ aggregate( ) 함수연습문제 1 ] 주어진과일판매현황 2.csv 파일을불러오세요 과일이름별로판매수량합계를출력하세요
[ aggregate( ) 함수연습문제 2 ] 주어진 subway_1.csv 파일을불러오세요
[ aggregate( ) 함수연습문제 3 ] 일자별승차인원합계를출력하세요 노선별하차인원합계를출력하세요 일자별노선별승차인원합계를출력하세요
3) apply( ) 함수로집계하기 > mat1 <- matrix(c(1,2,3, + 4,5,6),nrow=2,byrow=T) > mat1 [,1] [,2] [,3] [1,] 1 2 3 apply(data, 행 / 열, 작업함수 ) [2,] 4 5 6 > apply(mat1,1,sum) <-- 각행의합계를구하기 [1] 6 15 > apply(mat1,2,sum) <-- 각열의합계를구하기 [1] 5 7 9 > apply(mat1[,c(2,3)],2,max) <-- 2 열과 3 열의최대값구하기 [1] 5 6 > mat1[,c(2,3)] [,1] [,2] [1,] 2 3 [2,] 5 6
(1) lapply( ) 함수와 sapply( ) 함수 > list1 <- list(fruits$sales) <-- Fruits 의 Sales 값만가져와서 list1 변수에담습니다 > list1 [[1]] [1] 98 111 89 96 85 93 94 98 81 > list2 <- list(fruits$profit) <-- Fruits 의 Profit 값만가져와서 list2 변수에담습니다. > lapply(c(list1,list2),max) <-- list1 과 list2 에서 max 값을구해서 list 형태로출력합니다. [[1]] [1] 111 [[2]] [1] 32 > sapply(c(list1,list2),max) [1] 111 32
(1) lapply( ) 함수와 sapply( ) 함수 > lapply(fruits[,c(4,5)],max) $Sales [1] 111 $Expenses [1] 91 > sapply(fruits[,c(4,5)],max) Sales Expenses 111 91 > Fruits[,c(4,5)] Sales Expenses 1 98 78 2 111 79 3 89 76 4 96 81 5 85 76 6 93 80 7 94 78 8 98 91 9 81 71
> library(konlp) > str1 <- readlines("apply 연습용리뷰.txt") > str1 [1] " 가격은저렴하지만배송이늦어요 " " 가격과배송모두만족합니다 " [3] " 저렴하지만디자인이맘에안들어요 " > > str2 <- sapply(str1, extractnoun, USE.NAMES=F) > str2 [,1] [,2] [,3] [1,] " 가격 " " 가격 " " 저렴 " [2,] " 저렴 " " 배송 " " 디자인 " [3,] " 배송 " " 만족합니 " " 안들어 " > > str3 <- lapply(str1, extractnoun) > str3 [[1]] [1] " 가격 " " 저렴 " " 배송 " [[2]] [1] " 가격 " " 배송 " " 만족합니 " [[3]] [1] " 저렴 " " 디자인 " " 안들어 "
(2) tapply( ) 문법 : tapply( 출력값, 기준컬럼, 적용함수 ) > Fruits Fruit Year Location Sales Expenses Profit Date 1 Apples 2008 West 98 78 20 2008-12-31 2 Apples 2009 West 111 79 32 2009-12-31 3 Apples 2010 West 89 76 13 2010-12-31 4 Oranges 2008 East 96 81 15 2008-12-31 5 Bananas 2008 East 85 76 9 2008-12-31 6 Oranges 2009 East 93 80 13 2009-12-31 7 Bananas 2009 East 94 78 16 Fruit 2009-12-31 Sales 8 Oranges 2010 East 98 91 1 7 Apples 2010-12-31 298 9 Bananas 2010 East 81 71 210 Bananas 2010-12-31 260 > tapply(sales,fruit,sum) 3 Oranges 287 다음에오류가있습니다 tapply(sales, Fruit, sum) : 객체 'Fruit' 를찾을수없습니다 > attach(fruits) > tapply(sales,fruit,sum) <-- 과일이름 (Fruit) 별로합계 (sum) 판매량 (Sales) 구하기 Apples Bananas Oranges 298 260 287 > tapply(sales,year,sum) <-- 년도별로합계판매량구하기 2008 2009 2010 279 298 268 > aggregate(sales~fruit, Fruits, sum)
[ apply( ) 계열함수연습문제 -1] 1. 아래와같은내용의 data1.csv 파일이있습니다.( 제공된파일사용하세요 ) 위파일을 data1 이라는변수로불러들이세요. 그후년도별합계값과연령대별합계를아래와같이구하세요.
[ apply( ) 계열함수연습문제 -2 ] 2. 아래그림과같이작업을하세요. 1) 주어진 1-4 호선승하차승객수.csv 파일을불러와서 data2 라는변수에담으세요.
2) 아래그림과같이다양한결과를출력하는코드를적으세요.
3) 아래그림과같이다양한결과를출력하는코드를적으세요.
4) 아래그림과같이다양한결과를출력하는코드를적으세요. 주어진과일판매현황.csv 파일을불러오세요 왼쪽과같이과일이름별로판매금액합계를출력하세요.
5) 주어진 subway_1.xls 파일을불러와서 sub3 변수에담으세요
6) sub3 변수에담긴값으로아래와같이출력하세요
[ aggregate( ) 함수와 apply( ) 계열함수정리 ] 행이나열을기준으로연산작업을한다 apply( ) 계열함수 특정컬럼을기준으로집계한후연산작업을한다 aggregate( ) 계열함수 [ apply( ) 계열함수정리 ] 연산결과를리스트별로따로보여준다 lapply( ) 함수 연산결과를요약해서보여준다 sapply( ) 함수 연산결과를가로로펴서보여준다 tapply( ) 함수
4) 함수를직접만들어서사용하기 - 사용자정의함수 함수명 <- function( 입력값을저장할변수 ) { 계산식 1 계산식 2 return ( 계산결과반환값 ) } A 해라 B 입니다 (return)
[ 입력받은수의제곱한값을출력하는함수만들기 ] > myfunct2 <- function(a) { + b <- a^2 <-- 입력되는값의제곱구하기 + return(b) + } > myfunct2(3) [1] 9 [ 두수를입력받아서곱한결과를출력하는함수만들기 ] > myfunct3 <- function(a,b) { + c <- a*b <-- 입력되는두값을곱하기 + return(c) + } > myfunct3(2,3) [1] 6
[ 사용자정의함수연습문제 ] 1. 사용자에게두수를입력받아서첫번째수에서두번째수를빼고결과를출력하는함수를만드세요. ( 함수이름과사용할변수이름은각자임의로정하세요 )
데이터전처리를위해 반드시알아야할 필수패키지들소개
1. dplyr( ) 패키지 - 데이터프레임대상으로사용합니다 1) filter 조건을주어서필터링합니다 2) select 여러컬럼이있는데이터셋에서특정컬럼만선택해서사용합니다. 3) %>% - 여러명령을연결해서사용하는파이프라인기능을의미합니다 4) arrange 데이터를오름차순이나내림차순으로정렬합니다 5) mutate 기존의변수를활용하여새로운변수를생성합니다. 6) summarise (with group_by) 주어진데이터를집계합니다 (min, max, mean, count)
# 패키지를설치하고작업디렉토리를설정합니다 > install.packages("dplyr") > library(dplyr) > setwd("c:\\a_temp") # 실습용데이터로 2013 년프로야구선수의성적표를사용하겠습니다. > data1 <- read.csv("2013 년 _ 프로야구선수 _ 성적.csv") > data1 순위선수명포지션팀경기타수득점안타 X2루타 X3루타홈런타점도루볼넷삼진병살타율장타율출루율연봉 1 1 김태균 1루수한화 101 345 41 110 24 0 10 52 0 73 67 14 0.319 0.475 0.444 15.00 2 2 박병호 1루수넥센 128 450 91 143 17 0 37 117 10 92 96 7 0.318 0.602 0.437 5.00 3 3 최정 3루수 SK 120 434 75 137 18 0 28 83 24 64 109 10 0.316 0.551 0.429 7.00 4 4 박석민 3루수삼성 117 396 61 126 24 0 18 76 4 54 73 13 0.318 0.515 0.425 3.70 5 5 손아섭우익수롯데 128 498 83 172 23 4 11 69 36 64 88 9 0.345 0.474 0.421 4.00 6 6 정성훈 3루수 LG 121 407 64 127 22 1 9 62 13 59 58 12 0.312 0.437 0.405 5.00 7 7 배영섭중견수삼성 113 393 66 116 16 4 2 38 23 52 62 9 0.295 0.372 0.402 0.85 8 8 나지완좌익수 KIA 125 435 57 125 18 0 21 96 7 62 111 12 0.287 0.474 0.394 2.00 9 9 박정권 1루수 SK 110 363 56 106 20 1 18 70 4 64 79 5 0.292 0.501 0.394 2.35 10 10 박용택중견수 LG 125 476 79 156 22 4 7 67 13 52 71 5 0.328 0.435 0.393 3.50
1) filter 기능 # 위 data1 에서경기수가 120 경기이상인선수만모아서 data2 에저장합니다. > data2 <- filter(data1, 경기 > 120) > data2 순위선수명포지션팀경기타수득점안타 X2루타 X3루타홈런타점도루볼넷삼진병살타율장타율출루율연봉 1 2 박병호 1루수넥센 128 450 91 143 17 0 37 117 10 92 96 7 0.318 0.602 0.437 5.0 2 5 손아섭우익수롯데 128 498 83 172 23 4 11 69 36 64 88 9 0.345 0.474 0.421 4.0 3 6 정성훈 3루수 LG 121 407 64 127 22 1 9 62 13 59 58 12 0.312 0.437 0.405 5.0 4 8 나지완좌익수 KIA 125 435 57 125 18 0 21 96 7 62 111 12 0.287 0.474 0.394 2.0 5 10 박용택중견수 LG 125 476 79 156 22 4 7 67 13 52 71 5 0.328 0.435 0.393 3.5
# 이번에는 data1 에서경기수가 120 경기이상이면서득점이 80점이상인선수만모아서 # data3 에저장하겠습니다. > data3 <- filter(data1, 경기 > 120 & 득점 > 80 ) > data3 순위선수명포지션팀경기타수득점안타 X2루타 X3루타홈런타점도루볼넷삼진병살타율장타율출루율연봉 1 2 박병호 1루수넥센 128 450 91 143 17 0 37 117 10 92 96 7 0.318 0.602 0.437 5 2 5 손아섭우익수롯데 128 498 83 172 23 4 11 69 36 64 88 9 0.345 0.474 0.421 4 # 이번에는 data1 에서포지션이 1루수와 3루수만모아서 data4 에저장하겠습니다. > data4 <- filter(data1, 포지션 %in% c('1루수 ','3루수')) > data4 순위선수명포지션팀경기타수득점안타 X2루타 X3루타홈런타점도루볼넷삼진병살타율장타율출루율연봉 1 1 김태균 1루수한화 101 345 41 110 24 0 10 52 0 73 67 14 0.319 0.475 0.444 15.00 2 2 박병호 1루수넥센 128 450 91 143 17 0 37 117 10 92 96 7 0.318 0.602 0.437 5.00 3 3 최정 3루수 SK 120 434 75 137 18 0 28 83 24 64 109 10 0.316 0.551 0.429 7.00 4 4 박석민 3루수삼성 117 396 61 126 24 0 18 76 4 54 73 13 0.318 0.515 0.425 3.70 5 6 정성훈 3루수 LG 121 407 64 127 22 1 9 62 13 59 58 12 0.312 0.437 0.405 5.00 6 9 박정권 1루수 SK 110 363 56 106 20 1 18 70 4 64 79 5 0.292 0.501 0.394 2.35
# 이번에는 data1 에서포지션이 1루수와 3루수만모아서 data4 에저장하겠습니다. > data4 <- filter(data1, 포지션 %in% c('1루수 ','3루수')) > data4 순위선수명포지션팀경기타수득점안타 X2루타 X3루타홈런타점도루볼넷삼진병살타율장타율출루율연봉 1 1 김태균 1루수한화 101 345 41 110 24 0 10 52 0 73 67 14 0.319 0.475 0.444 15.00 2 2 박병호 1루수넥센 128 450 91 143 17 0 37 117 10 92 96 7 0.318 0.602 0.437 5.00 3 3 최정 3루수 SK 120 434 75 137 18 0 28 83 24 64 109 10 0.316 0.551 0.429 7.00 4 4 박석민 3루수삼성 117 396 61 126 24 0 18 76 4 54 73 13 0.318 0.515 0.425 3.70 5 6 정성훈 3루수 LG 121 407 64 127 22 1 9 62 13 59 58 12 0.312 0.437 0.405 5.00 6 9 박정권 1루수 SK 110 363 56 106 20 1 18 70 4 64 79 5 0.292 0.501 0.394 2.35 > pos <-c('1루수 ','2루수','3루수') > pos > for (i in 1:length(pos)) { > data4 <- filter(data1, 포지션 == pos[i]) > print(data4) 검색할대상을외부변수에서입력받기
2) select 기능 특정컬럼 ( 라벨 ) 만지정해서조회하는기능 # 이번에는 data1 에서선수명, 포지션, 팀컬럼데이터만조회하겠습니다. > select(data1, 선수명, 포지션, 팀 ) 선수명포지션팀 1 김태균 1루수한화 2 박병호 1루수넥센 3 최정 3루수 SK 4 박석민 3루수삼성 5 손아섭우익수롯데 6 정성훈 3루수 LG 7 배영섭중견수삼성 8 나지완좌익수 KIA 9 박정권 1루수 SK 10 박용택중견수 LG
# data1 에서조회하고싶은컬럼의범위를연속적으로지정하기 > select (data1, 순위 : 타수 ) 순위선수명포지션팀경기타수 1 1 김태균 1루수한화 101 345 2 2 박병호 1루수넥센 128 450 3 3 최정 3루수 SK 120 434 4 4 박석민 3루수삼성 117 396 5 5 손아섭우익수롯데 128 498 6 6 정성훈 3루수 LG 121 407 7 7 배영섭중견수삼성 113 393 8 8 나지완좌익수 KIA 125 435 9 9 박정권 1루수 SK 110 363 10 10 박용택중견수 LG 125 476
# 기호를사용해서특정컬럼만제외하고출력하기 > select(data1,- 홈런,- 타점,- 도루 ) 순위선수명포지션팀경기타수득점안타 X2루타 X3루타볼넷삼진병살타율장타율출루율연봉 1 1 김태균 1루수한화 101 345 41 110 24 0 73 67 14 0.319 0.475 0.444 15.00 2 2 박병호 1루수넥센 128 450 91 143 17 0 92 96 7 0.318 0.602 0.437 5.00 3 3 최정 3루수 SK 120 434 75 137 18 0 64 109 10 0.316 0.551 0.429 7.00 4 4 박석민 3루수삼성 117 396 61 126 24 0 54 73 13 0.318 0.515 0.425 3.70 5 5 손아섭우익수롯데 128 498 83 172 23 4 64 88 9 0.345 0.474 0.421 4.00 6 6 정성훈 3루수 LG 121 407 64 127 22 1 59 58 12 0.312 0.437 0.405 5.00 7 7 배영섭중견수삼성 113 393 66 116 16 4 52 62 9 0.295 0.372 0.402 0.85 8 8 나지완좌익수 KIA 125 435 57 125 18 0 62 111 12 0.287 0.474 0.394 2.00 9 9 박정권 1루수 SK 110 363 56 106 20 1 64 79 5 0.292 0.501 0.394 2.35 10 10 박용택중견수 LG 125 476 79 156 22 4 52 71 5 0.328 0.435 0.393 3.50
3) 여러문장을조합해서사용하는방법 %>% 기법 파이프라인기능 # 아래예는 data1 에서선수명, 팀, 경기, 타수를조회하되타수가 400 이상인 # 선수만출력하는예제입니다. > data1 %>% + select ( 선수명, 팀, 경기, 타수 ) %>% + filter( 타수 > 400) 선수명팀경기타수 1 박병호넥센 128 450 2 최정 SK 120 434 3 손아섭롯데 128 498 4 정성훈 LG 121 407 5 나지완 KIA 125 435 6 박용택 LG 125 476
4) arrange( ) 함수를사용하여출력결과를정렬 # arrange( ) 함수만추가하면되겠죠? > data1 %>% + select ( 선수명, 팀, 경기, 타수 ) %>% + filter( 타수 > 400) %>% + arrange( 타수 ) 선수명팀경기타수 1 정성훈 LG 121 407 2 최정 SK 120 434 3 나지완 KIA 125 435 4 박병호넥센 128 450 5 박용택 LG 125 476 6 손아섭롯데 128 498 arrange(desc( 타수 ))
5) mutate( ) 함수를이용해서데이터를가공해서새로운컬럼을추가하기 > data1 %>% + select ( 선수명, 팀, 경기, 타수 ) %>% + mutate( 경기 x 타수 = 경기 * 타수 ) %>% + arrange( 경기 x 타수 ) 선수명 팀경기타수경기x타수 1 김태균한화 101 345 34845 2 박정권 SK 110 363 39930 3 배영섭삼성 113 393 44409 4 박석민삼성 117 396 46332 5 정성훈 LG 121 407 49247 6 최정 SK 120 434 52080 7 나지완 KIA 125 435 54375 8 박병호넥센 128 450 57600 9 박용택 LG 125 476 59500 10 손아섭롯데 128 498 63744
6) summarise 와 group_by 를사용하여집계하기 # 아래예제는 data1 에서팀별로평균경기횟수를출력한예입니다. > data1 %>% + group_by( 팀 ) %>% + summarise( 평균 = mean( 경기,na.rm = TRUE) ) Source: local data frame [7 x 2] 팀 평균 (fctr) (dbl) 1 KIA 125 2 LG 123 3 SK 115 4 넥센 128 5 롯데 128 6 삼성 115 7 한화 101
# 아래예제는여러컬럼을대상으로집계하는예입니다 # 각팀별로경기와타수의평균을각각구해보겠습니다. > data1 %>% + group_by( 팀 )%>% + summarise_each(funs(mean), 경기, 타수 ) Source: local data frame [7 x 3] 팀경기타수 (fctr) (dbl) (dbl) 1 KIA 125 435.0 2 LG 123 441.5 3 SK 115 398.5 4 넥센 128 450.0 5 롯데 128 498.0 6 삼성 115 394.5 7 한화 101 345.0
# 아래예는경기와타수의평균을구할때몇개인지개수까지보여줍니다. > data1 %>% + group_by( 팀 )%>% + summarise_each(funs(mean,n( )), 경기, 타수 ) Source: local data frame [7 x 5] 팀경기 _mean 타수 _mean 경기 _n 타수 _n (fctr) (dbl) (dbl) (int) (int) 1 KIA 125 435.0 1 1 2 LG 123 441.5 2 2 3 SK 115 398.5 2 2 4 넥센 128 450.0 1 1 5 롯데 128 498.0 1 1 6 삼성 115 394.5 2 2 7 한화 101 345.0 1 1
dplyr 패키지연습문제 - 1
dplyr 패키지연습문제 - 2
dplyr 패키지연습문제 - 3
dplyr 패키지연습문제 - 4
dplyr 패키지연습문제 - 5
dplyr 패키지연습문제 - 6
dplyr 패키지연습문제 - 7
2. plyr( ) 패키지 이기능은앞에서배운 apply( ) 함수를확장한것입니다. 이기능은 ply( ) 라는함수앞에 2 글자를적어주게되는데첫번째글자는입력될데이터유형이고두번째글자는출력될데이터유형이며각글자의의미는아래와같습니다. - d : data frame - a : array ( matrix 포함 ) - l : list 이설명만가지고는 Data frame List Array Data frame ddply() ldply( ) adply( ) List dlply( ) llply( ) alply() Array daply( ) laply( ) aaply( )
입력값 출력값 Array List data frame ply( ) 함수 Array List data frame d d ply( )
> library("plyr") > > library(googlevis) > > Fruits Fruit Year Location Sales Expenses Profit Date 1 Apples 2008 West 98 78 20 2008-12-31 2 Apples 2009 West 111 79 32 2009-12-31 3 Apples 2010 West 89 76 13 2010-12-31 4 Oranges 2008 East 96 81 15 2008-12-31 5 Bananas 2008 East 85 76 9 2008-12-31 6 Oranges 2009 East 93 80 13 2009-12-31 7 Bananas 2009 East 94 78 16 2009-12-31 8 Oranges 2010 East 98 91 7 2010-12-31 9 Bananas 2010 East 81 71 10 2010-12-31
> ddply(fruits,'fruit',summarise,sum_sales=sum(sales), sum_profit=sum(profit) ) Fruit sum_sales sum_profit 1 Apples 298 65 2 Bananas 260 35 3 Oranges 287 35 ddply( 데이터, 기준컬럼, summarise/transform, 작업 ) - summarise : 전체데이터의요약을보여줍니다 - transform : 각행의데이터들을대상으로보여줍니다
> dlply(fruits, 'Fruit, summarise, sum_sales=sum(sales), sum_profit=sum(profit) ) $Apples sum_sales sum_profit 1 298 65 $Bananas sum_sales sum_profit 1 260 35 dlply( ) 함수라서출력결과를 List 형태로보여줍니다 $Oranges sum_sales sum_profit 1 287 35 attr(,"split_type") [1] "data.frame" attr(,"split_labels") Fruit 1 Apples 2 Bananas 3 Oranges
> ddply(fruits, c('year','fruit'), summarise, Max_Pro=max(Profit)) Year Fruit Max_Pro 1 2008 Apples 20 2 2008 Bananas 9 3 2008 Oranges 15 4 2009 Apples 32 5 2009 Bananas 16 6 2009 Oranges 13 7 2010 Apples 13 8 2010 Bananas 10 9 2010 Oranges 7 기준컬럼을 2 개이상설정하기
> ddply(fruits, 'Fruit, transform, sum_sales=sum(sales), + pct_sales=(100*sales)/sum(sales) ) Fruit Year Location Sales Expenses Profit Date sum_sales pct_sales 1 Apples 2008 West 98 78 20 2008-12-31 298 32.88591 2 Apples 2009 West 111 79 32 2009-12-31 298 37.24832 3 Apples 2010 West 89 76 13 2010-12-31 298 29.86577 4 Bananas 2008 East 85 76 9 2008-12-31 260 32.69231 5 Bananas 2009 East 94 78 16 2009-12-31 260 36.15385 6 Bananas 2010 East 81 71 10 2010-12-31 260 31.15385 7 Oranges 2008 East 96 81 15 2008-12-31 287 33.44948 8 Oranges 2009 East 93 80 13 2009-12-31 287 32.40418 9 Oranges 2010 East 98 91 7 2010-12-31 287 34.14634 >
[ plyr 패키지연습문제 1 ] 주어진 subway_2.csv 파일을왼쪽과같이 subway_2 라는변수로불러오세요
[ plyr 패키지연습문제 2 ] 위그림과같이 subway_2 변수에저장된값을활용하여일자별로승차인원합계, 하차인원합계, 승하차인원차이를요약해서출력하세요.
[ plyr 패키지연습문제 3] 이그림과같이 subway_2 변수에저장된값을활용하여승차인원합계, 하차인원합계, 해당일의승차인원합계에서각노선별승차인원이차지하는비율을출력하세요.
3) reshape2( ) 패키지 이패키지는옆으로컬럼이많은형태 ( Wide ) 를세로로긴 ( Long ) 형태로변경해주고반대로세로로긴형태를옆으로넓게바꿔주는아주유용한패키지입니다. 이패키지중에 melt 함수와 cast 함수가가장많이사용됩니다. Wide 형태 Long 형태 melt( ) 이름주소연락처생일이름 dcast( ) 주소연락처생일
> install.packages( reshape2 ) > library( reshape2 ) > library( googlevis ) (1) melt( ) 함수로 wide -> long 형태로변형하기 > melt(fruits, id = 'Year') Year variable value 1 2008 Fruit Apples 2 2009 Fruit Apples 3 2010 Fruit Apples 4 2008 Fruit Oranges 5 2008 Fruit Bananas 6 2009 Fruit Oranges 7 2009 Fruit Bananas 8 2010 Fruit Oranges 9 2010 Fruit Bananas 10 2008 Location West 11 2009 Location West ( 지면관계상이하내용은생략하겠습니다 )
> melt(fruits, id=c('year','fruit')) Year Fruit variable value 1 2008 Apples Location West 2 2009 Apples Location West 3 2010 Apples Location West 4 2008 Oranges Location East 5 2008 Bananas Location East 6 2009 Oranges Location East 7 2009 Bananas Location East 8 2010 Oranges Location East 9 2010 Bananas Location East 10 2008 Apples Sales 98 11 2009 Apples Sales 111 12 2010 Apples Sales 89 13 2008 Oranges Sales 96 14 2008 Bananas Sales 85 15 2009 Oranges Sales 93 16 2009 Bananas Sales 94 17 2010 Oranges Sales 98 18 2010 Bananas Sales 81 ( 지면관계상이하내용은생략합니다 ) 두개이상의칼럼을고정하기
(2) cast ( ) 함수로 long -> wide 형태로변형하기 > mtest <- melt(fruits, id=c('year','fruit')) 경고메시지 ( 들 ): attributes are not identical across measure variables; they will be dropped > > mtest Year Fruit variable value 1 2008 Apples Location West 2 2009 Apples Location West 3 2010 Apples Location West 4 2008 Oranges Location East 5 2008 Bananas Location East 6 2009 Oranges Location East 7 2009 Bananas Location East 8 2010 Oranges Location East 9 2010 Bananas Location East ( 지면관계상이하내용은생략합니다 )
> dcast(mtest, Year+Fruit~variable) Year Fruit Location Sales Expenses Profit Date 1 2008 Apples West 98 78 20 14244 2 2008 Bananas East 85 76 9 14244 3 2008 Oranges East 96 81 15 14244 4 2009 Apples West 111 79 32 14609 5 2009 Bananas East 94 78 16 14609 6 2009 Oranges East 93 80 13 14609 7 2010 Apples West 89 76 13 14974 8 2010 Bananas East 81 71 10 14974 9 2010 Oranges East 98 91 7 14974
reshape2 패키지연습문제 1 주어진 2000-2013 년연령별실업율 _ 연령별평균.csv 파일을 reshape2 패키지로적절하게변환한후아래와같이연도별실업률의합계를구하세요
reshape2 패키지연습문제 2 주어진 2000-2013 년연령별실업율 _ 연령별평균.csv 파일을 reshape2 패키지로적절하게변환한후아래와같이년도별연령별실업률의합계를구하세요
4) tidyr( ) 패키지사용하기 > install.packages("tidyr") > library("tidyr") > var1 <- read.csv("2000-2013년연령별실업율 _ 연령별평균.csv") > var2 <- var1[, c(1:3) ] ; var2 연령별 X2000년 X2001년 1 20대 7.5 7.4 2 30대 3.6 3.2 3 40대 3.5 3.0 4 50대 3.3 2.8 5 60세이상 1.5 1.2 > var3 <- spread(var2, 연령별,X2000년,fill=0) ; var3 X2001년 20대 30대 40대 50대 60세이상 1 1.2 0.0 0.0 0.0 0.0 1.5 2 2.8 0.0 0.0 0.0 3.3 0.0 3 3.0 0.0 0.0 3.5 0.0 0.0 4 3.2 0.0 3.6 0.0 0.0 0.0 5 7.4 7.5 0.0 0.0 0.0 0.0 spread( ) 함수와 dcast( ) 함수는같은역할
> var2 연령별 X2000년 X2001년 1 20대 7.5 7.4 2 30대 3.6 3.2 3 40대 3.5 3.0 4 50대 3.3 2.8 5 60세이상 1.5 1.2 > var4 <- gather(var2," 연령별 ", 실업율,2:3); var4 연령별연령별실업율 1 20대 X2000년 7.5 2 30대 X2000년 3.6 3 40대 X2000년 3.5 4 50대 X2000년 3.3 5 60세이상 X2000년 1.5 6 20대 X2001년 7.4 7 30대 X2001년 3.2 8 40대 X2001년 3.0 9 50대 X2001년 2.8 10 60세이상 X2001년 1.2 gather( ) 함수는 melt( ) 함수와같은역할
5) stringr ( ) 패키지 > install.packages("stringr") > library(stringr) (1) str_detect( ) 함수 특정문자포함여부확인 > fruits <- c('apple','apple','banana','pineapple') > str_detect(fruits,'a') # 대문자 A 가있는단어찾기 [1] FALSE TRUE FALSE FALSE > str_detect(fruits,'^a') # 첫글자가소문자 a 인단어찾기 [1] TRUE FALSE FALSE FALSE > str_detect(fruits,'e$') # 끝나는글자가소문자 e 인단어찾기 [1] TRUE TRUE FALSE TRUE > str_detect(fruits,'^[aa]') # 시작하는글자가대문자 A 나소문자 a 인단어찾기 [1] TRUE TRUE FALSE FALSE > str_detect(fruits,'[aa]') # 단어에소문자 a 와대문자 A 가들어있는단어찾기 [1] TRUE TRUE TRUE TRUE
(2) ignore.case( ) 함수 대소문자무시하기 > str_detect(fruits,ignore.case('a')) [1] TRUE TRUE TRUE TRUE (3) str_count ( ) 함수 특정문자출현횟수세기 > fruits [1] "apple" "Apple" "banana" "pineapple" > str_count(fruits,ignore.case('a')) [1] 1 1 3 1 > str_count(fruits,'a') [1] 1 0 3 1
(4) str_c( ) 함수 문자열을합치기 > str_c("apple","banana") [1] "applebanana" > str_c("fruits: ",fruits) [1] "Fruits: apple" "Fruits: Apple" "Fruits: banana" [4] "Fruits: pineapple" > str_c(fruits," name is ",fruits) [1] "apple name is apple" "Apple name is Apple" [3] "banana name is banana" "pineapple name is pineapple" > str_c(fruits,collapse="") [1] "appleapplebananapineapple" > str_c(fruits,collapse="-") [1] "apple-apple-banana-pineapple"
(5) str_dup( ) 함수 반복출력하기 > str_dup(fruits,3) [1] "appleappleapple" "AppleAppleApple" [3] "bananabananabanana" "pineapplepineapplepineapple" (6) str_length( ) 함수 문자열의길이출력하기 > str_length('apple') [1] 5 > str_length(fruits) [1] 5 5 6 9
(7) str_locate( ) 함수 특정문자의위치값찾기 > str_locate('apple','a') start end [1,] 1 1 > str_locate(fruits,'a') start end [1,] 1 1 [2,] NA NA [3,] 2 2 [4,] 5 5
(8) str_replace( ) 함수 > str_replace('apple','p','*') [1] "a*ple > str_replace('apple','p','**') [1] "a**ple > str_replace_all('apple','p','*') [1] "a**le"
(9) str_split( ) 함수 > fruits <- str_c('apple','/','orange','/','banana') > fruits [1] "apple/orange/banana" > str_split(fruits,"/") # / 기호를기준으로분리를했습니다. [[1]] [1] "apple" "orange" "banana" (10) str_sub( ) 함수 > fruits [1] "apple/orange/banana" > str_sub(fruits,start=1,end=3) [1] "app" > str_sub(fruits,start=6,end=9) [1] "/ora" > str_sub(fruits,start=-5) # - 는뒤에서부터시작합니다. [1] "anana"
stringr( ) 패키지연습문제 1 아래와같이 tel 변수에저장된값에서전화번호의국번만출력하도록 stringr 패키지를활용하여코드를완성하세요.
주어진 stringr 연습문제.txt 파일을활용하여옆의빈칸부분을채우세요
이번과정을 모두마쳤습니다. 연습문제와보조자료를 열심히연습해주세요 ~~ 수고하셨습니다