함수명 <- function (인수 또는 입력값) {
계산식 1
계산식 2
Return (계산 결과 반환값)
}
1. 입력 값 없는 경우
> myfunct1 <- function(){
+ return(10)
+ }
>
> myfunct1
function(){
return(10)
}
> myfunct1()
[1] 10
2. 함수에 입력되는 값 (인자)이 있는 경우
> myfunct2 <- function(a) {
+ b <- a^2
+ return(b)
+ }
>
> myfunct2
function(a) {
b <- a^2
return(b)
}
>
> myfunct2(2)
[1] 4
> myfunct2(3)
[1] 9
>
> myfunct3 <- function(a,b){
+ c <- a*b
+ return(c)
+ }
>
> myfunct3(2,3)
[1] 6
3. 데이터 정렬하기 - sort( ) 활용
> 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
>
> sort1 <- Fruits$Sales
> sort1
[1] 98 111 89 96 85 93 94 98 81
>
> sort(sort1)
[1] 81 85 89 93 94 96 98 98 111
>
> sort(sort1, decreasing=T)
[1] 111 98 98 96 94 93 89 85 81
4. 데이터 합치기 - merge( ), cbind( )
- DBMS에서 JOIN처럼 다른 데이터 프레임에 있는 데이터를 공통적으로 있는 컬럼기준으로 비교해서 합치기 가능
- cbind( ) 함수를 사용하여 컬럼 추가 가능
> df1 <- data.frame(name=c('apple','banana','cherry'),
+ price=c(300,200,100))
>
> df2 <- data.frame(name=c('apple','cherry','berry'),
+ qty=c(10,20,30))
>
> df1
name price
1 apple 300
2 banana 200
3 cherry 100
> df2
name qty
1 apple 10
2 cherry 20
3 berry 30
>
> # df1을 기준으로 df2와 공통으로 있는 name 컬럼을 기준으로 데이터 출력
> merge(df1, df2)
name price qty
1 apple 300 10
2 cherry 100 20
>
> # df2을 기준으로 df1와 공통으로 있는 컬럼 데이터 출력
> merge(df2, df1)
name qty price
1 apple 10 300
2 cherry 20 100
>
> # df1과 df2를 합쳐서 하나의 데이터프레임으로 만들기
> cbind(df1, df2)
name price name qty
1 apple 300 apple 10
2 banana 200 cherry 20
3 cherry 100 berry 30
> cbind(df2, df1)
name qty name price
1 apple 10 apple 300
2 cherry 20 banana 200
3 berry 30 cherry 100
5. plyr ( ) 패키지
- 원본 데이터를 분석하기 쉬운 형태로 나누어서 다시 새로운 형태로 만들어 주는 패키지
- apply( ) 함수 확장
- ply( )앞에 함수 두글자를 적어서 사용 ( d: data frame, a : array (matrix 포함), l : list )
- 기본문법 : ddply(data, 기준컬럼, 적용함수)
|
Data frame |
List |
Array |
Data frame |
ddply( ) |
ldply( ) |
adply( ) |
List |
dlply( ) |
llply( ) |
adply( ) |
Array |
daply( ) |
laply( ) |
aaply( ) |
- summarise : 합계정보를 계산해서 출력하고 싶을때, SQL에서 GROUP BY와 비슷한 역할
- transform : 다른 계산을 해서 컬럼을 추가하고 싶을때
> setwd("d:\\r_temp")
> library(plyr)
>
> fruits <-read.csv("fruits_10.csv", header=T)
> fruits
year name qty price
1 2000 apple 6 6000
2 2000 banana 2 1000
3 2000 peach 7 3500
4 2000 berry 9 900
5 2001 apple 10 10000
6 2001 banana 7 3500
7 2001 peach 3 1500
8 2001 berry 15 1500
9 2002 apple 13 13000
10 2002 banana 10 5000
11 2002 peach 5 2500
12 2002 berry 11 1100
>
> ddply(fruits, 'name', summarise, sum_qty=sum(qty), sum_price=sum(price))
name sum_qty sum_price
1 apple 29 29000
2 banana 19 9500
3 berry 35 3500
4 peach 15 7500
>
> ddply(fruits, 'name', transform, sum_qty=sum(qty), sum_qty=(100*qty)/sum(qty))
year name qty price sum_qty sum_qty.1
1 2000 apple 6 6000 29 20.68966
2 2001 apple 10 10000 29 34.48276
3 2002 apple 13 13000 29 44.82759
4 2000 banana 2 1000 19 10.52632
5 2001 banana 7 3500 19 36.84211
6 2002 banana 10 5000 19 52.63158
7 2000 berry 9 900 35 25.71429
8 2001 berry 15 1500 35 42.85714
9 2002 berry 11 1100 35 31.42857
10 2000 peach 7 3500 15 46.66667
11 2001 peach 3 1500 15 20.00000
12 2002 peach 5 2500 15 33.33333
6. reshape2( ) 패키지
- 컬럼이 많은 형태(wide)를 세로로 긴 형태(long)로 변경, 세로로 긴 형태(long)를 넓은형태로(wide) 변경
- melt함수와 cast함수가 가장 많이 사용됨
- melt : wide -> long
- cast : long -> wide
> install.packages("reshape2")
Installing package into ‘C:/Users/stu/Documents/R/win-library/3.1’
(as ‘lib’ is unspecified)
--- 현재 세션에서 사용할 CRAN 미러를 선택해 주세요 ---
URL 'http://cran.nexr.com/bin/windows/contrib/3.1/reshape2_1.4.zip'을 시도합니다
Content type 'application/zip' length 498187 bytes (486 Kb)
URL을 열었습니다
downloaded 486 Kb
패키지 ‘reshape2’를 성공적으로 압축해제하였고 MD5 sums 이 확인되었습니다
다운로드된 바이너리 패키지들은 다음의 위치에 있습니다
C:\Users\stu\AppData\Local\Temp\Rtmpe4Ks99\downloaded_packages
> library("reshape2")
>
> fruits
year name qty price
1 2000 apple 6 6000
2 2000 banana 2 1000
3 2000 peach 7 3500
4 2000 berry 9 900
5 2001 apple 10 10000
6 2001 banana 7 3500
7 2001 peach 3 1500
8 2001 berry 15 1500
9 2002 apple 13 13000
10 2002 banana 10 5000
11 2002 peach 5 2500
12 2002 berry 11 1100
>
> # melt함수로 wide->long형태로 변형
> melt(fruits, id='year')
year variable value
1 2000 name apple
2 2000 name banana
3 2000 name peach
4 2000 name berry
5 2001 name apple
6 2001 name banana
7 2001 name peach
8 2001 name berry
9 2002 name apple
10 2002 name banana
11 2002 name peach
12 2002 name berry
13 2000 qty 6
14 2000 qty 2
15 2000 qty 7
16 2000 qty 9
17 2001 qty 10
18 2001 qty 7
19 2001 qty 3
20 2001 qty 15
21 2002 qty 13
22 2002 qty 10
23 2002 qty 5
24 2002 qty 11
25 2000 price 6000
26 2000 price 1000
27 2000 price 3500
28 2000 price 900
29 2001 price 10000
30 2001 price 3500
31 2001 price 1500
32 2001 price 1500
33 2002 price 13000
34 2002 price 5000
35 2002 price 2500
36 2002 price 1100
경고메시지:
attributes are not identical across measure variables; they will be dropped
>
> melt(fruits, id=c('year','name'), variable.name='var_name', value.name='val_name')
year name var_name val_name
1 2000 apple qty 6
2 2000 banana qty 2
3 2000 peach qty 7
4 2000 berry qty 9
5 2001 apple qty 10
6 2001 banana qty 7
7 2001 peach qty 3
8 2001 berry qty 15
9 2002 apple qty 13
10 2002 banana qty 10
11 2002 peach qty 5
12 2002 berry qty 11
13 2000 apple price 6000
14 2000 banana price 1000
15 2000 peach price 3500
16 2000 berry price 900
17 2001 apple price 10000
18 2001 banana price 3500
19 2001 peach price 1500
20 2001 berry price 1500
21 2002 apple price 13000
22 2002 banana price 5000
23 2002 peach price 2500
24 2002 berry price 1100
>
> mtest <- melt(fruits, id=c('year', 'name'), variable.name='var_name', value.name='val_name')
> mtest
year name var_name val_name
1 2000 apple qty 6
2 2000 banana qty 2
3 2000 peach qty 7
4 2000 berry qty 9
5 2001 apple qty 10
6 2001 banana qty 7
7 2001 peach qty 3
8 2001 berry qty 15
9 2002 apple qty 13
10 2002 banana qty 10
11 2002 peach qty 5
12 2002 berry qty 11
13 2000 apple price 6000
14 2000 banana price 1000
15 2000 peach price 3500
16 2000 berry price 900
17 2001 apple price 10000
18 2001 banana price 3500
19 2001 peach price 1500
20 2001 berry price 1500
21 2002 apple price 13000
22 2002 banana price 5000
23 2002 peach price 2500
24 2002 berry price 1100
>
> # dcast함수를 사용하여 long->wide로
> dcast(mtest, year+name~var_name)
Using val_name as value column: use value.var to override.
year name qty price
1 2000 apple 6 6000
2 2000 banana 2 1000
3 2000 berry 9 900
4 2000 peach 7 3500
5 2001 apple 10 10000
6 2001 banana 7 3500
7 2001 berry 15 1500
8 2001 peach 3 1500
9 2002 apple 13 13000
10 2002 banana 10 5000
11 2002 berry 11 1100
12 2002 peach 5 2500
>
> dcast(mtest, year~var_name)
Using val_name as value column: use value.var to override.
Aggregation function missing: defaulting to length
year qty price
1 2000 4 4
2 2001 4 4
3 2002 4 4
>
> dcast(mtest, name~var_name, sum)
Using val_name as value column: use value.var to override.
name qty price
1 apple 29 29000
2 banana 19 9500
3 berry 35 3500
4 peach 15 7500
>
> # 특정조건을 주고싶다면 subset파라미터 사용
> # subset을 사용하려면 libarary(plyr)명령이 실행되어 있어야 함
> dcast(mtest, name~var_name, sum, subset=.(name=='apple'))
Using val_name as value column: use value.var to override.
name qty price
1 apple 29 29000
8. reshape2( ) 패키지
- 대상데이터가 문자일 경우 쉽게 처리할수 있는 패키지
> install.packages("stringr")
Installing package into ‘C:/Users/stu/Documents/R/win-library/3.1’
(as ‘lib’ is unspecified)
URL 'http://cran.nexr.com/bin/windows/contrib/3.1/stringr_0.6.2.zip'을 시도합니다
Content type 'application/zip' length 75213 bytes (73 Kb)
URL을 열었습니다
downloaded 73 Kb
패키지 ‘stringr’를 성공적으로 압축해제하였고 MD5 sums 이 확인되었습니다
다운로드된 바이너리 패키지들은 다음의 위치에 있습니다
C:\Users\stu\AppData\Local\Temp\Rtmpe4Ks99\downloaded_packages
> library(stringr)
> # str_detect(): 주어진 데이터들에서 특정문자가 있는지를 검사해서 true/false 출력
> 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
>
> # ignore.case(): 대소문자 구분을 안하도록 설정하는 함수
> str_detect(fruits, ignore.case('a'))
[1] TRUE TRUE TRUE TRUE
>
> #str_c(): paste()처럼 주어진 문자열을 합쳐서 출력하는 함수
> str_c("apple", "banana")
[1] "applebanana"
> str_c("Fuits: ", fruits)
[1] "Fuits: apple" "Fuits: Apple" "Fuits: banana" "Fuits: 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"
>
> # str_dup(): 주어진 문자열을 주어진 횟수만큰 반복해서 출력
> str_dup(fruits,3)
[1] "appleappleapple" "AppleAppleApple"
[3] "bananabananabanana" "pineapplepineapplepineapple"
>
> # str_length(): 주어진 문자열의 길이를 출력하는 함수
> str_length('apple')
[1] 5
> str_length(fruits)
[1] 5 5 6 9
>
> # 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
>
> # str_replace(): 변경전 문자를 변경후 문자로 바꾸는 함수
> str_replace('apple','p','*')
[1] "a*ple"
> str_replace('apple','p','**')
[1] "a**ple"
>
> str_replace_all('apple','p','*')
[1] "a**le"
>
> # str_split(): 주어진 데이터셋을 지정된 기호로 분리하는 함수
> fruits <- str_c('apple','/','orange','/','banana')
> fruits
[1] "apple/orange/banana"
> str_split(fruits,"/")
[[1]]
[1] "apple" "orange" "banana"
>
> # 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"
>
> # str_trim(): 문자열의 가장앞과 가장뒤에 공백이 있을경우 제거해 주는 함수
> str_trim(' apple banana berry ')
[1] "apple banana berry"
'data > R 프로그래밍' 카테고리의 다른 글
R의 정규식 (원하는 데이터를 쉽게 찾고 만들기) (정리x) (0) | 2014.12.01 |
---|---|
R의 조건문과 반복문 (1) | 2014.12.01 |
R로 데이터를 원하는 모양으로 변형하기 ② (숫자함수) (0) | 2014.11.28 |
R로 데이터를 원하는 모양으로 변형하기 ① (기본함수) (0) | 2014.11.28 |
R에서 데이터 불러오기/저장하기 (0) | 2014.11.28 |
댓글