2014년 5월 19일 월요일

[Using R] R Language Basic #3 - Sample Data

R Language Basic #3 - Sample Data

R Language Basic #1 Review
R Language Basic #2 Review


10. Subset, Transform, Split (데이터 프레임 조작) 
이전 데이터 프레임 샘플을 통해서 데이터프레임을 조건절로 추출하고 제외하는 방법들을 테스트 해봤을 것이다. 좀더 기본적으로 R에서 제공되는 함수를 활용하여 데이터 프레임을 조작하는 방식을 연습해보도록 한다.

> sensory.Training <- subset(sensory, Training == "Yes")
> sensory.Training
  Name Training Sweetness Saltiness
1 토니      Yes         8         4
3 모락      Yes         9         2
5 포쿡      Yes         5         1

> sensory.modified <- transform(sensory, comp=Sweetness/Saltiness)
> sensory.modified
    Name Training Sweetness Saltiness      comp
1   토니      Yes         8         4 2.0000000
2   매드       No         9         2 4.5000000
3   모락      Yes         9         2 4.5000000
4 시추안       No         4         6 0.6666667
5   포쿡      Yes         5         1 5.0000000
6 식당돈       No         5         4 1.2500000


- subset( )함수와 transform( ) 함수의 사용방법은 거의 동일하다. 좀더 세부적인 함수에 대한 내용이 보고 싶다면 help(함수명) 실행하면 함수의 기본적인 설명과 함께 인자값에 대한 내용과 샘플 소스를 얻을 수 있을 것이다. 다시 돌아가서 subset이 하위의 새로운 데이터프레임을 만들기 위한 선택 조건을 인자로 하고 transform이 새로운 변수(열) 생성을 위한 데이터 표현식을 입력인자로 한다는 점만이 틀리다는 것을 확인 할 수 있다.

> Sweetness.group <- split(sensory$Sweetness, sensory$Training)
> Sweetness.group
$No
[1] 9 4 5

$Yes
[1] 8 9 5


- split(sensory$Sweetness, sensory$Training)은 Training 벡터 값(2번째 인자)을 기준으로 Sweetness 값(1번째 인자)을 그룹화시켜 목록(lists)으로 생성하라는 표현 식이다. split( )함수는 2번째 인자를 그룹요인(grouping factor)으로 하여 1번째 인자 데이터를 그룹화한 목록으로 생성한다

> Sweetness.group.No <- sensory$Sweetness[sensory$Training == "No"]
> Sweetness.group.No
[1] 9 4 5



11. Sorting (정렬) 


> cost.pre <- c(1100, 1560, 1570, 4980, 5300, 7780, 4680)
> cost.post <- c(1530, 1650, 1890, 5910, 5310, 8900, 10600)

> sort(cost.pre)
[1] 1100 1560 1570 4680 4980 5300 7780

 - sort(cost.pre)는 단일벡터 cost.pre의 요소를 오름차순으로 정렬시킨 벡터를 결과값으로 출력한다.


> cost.post
[1]  1530  1650  1890  5910  5310  8900 10600

> order(cost.post)
[1] 1 2 3 5 4 6 7

> cost.pre[order(cost.post)]
[1] 1100 1560 1570 5300 4980 7780 4680

 - order(cost.post)은 오름차순으로 정렬된 각 요소의 색인값을 출력하는 함수로 이해 할 수 있다.

> score <- c(32, 12, 45, 54, 98, 23, 4, 56, 12, 15, 65, 23)
> gender <- rep(c("M", "F"), 6)
> age <- c(23, 12, 34, 45, 23, 56, 17, 35, 32, 34, 65, 43)
> freq.score <- data.frame(score, gender, age)

> freq.score
   score gender age
 1     32      M  23
 2     12      F  12
 3     45      M  34
 4     54      F  45
 5     98      M  23
 6     23      F  56
 7      4      M  17
 8     56      F  35
 9     12      M  32
10    15      F  34
11    65      M  65
12    23      F  43

> freq.score[order(freq.score$gender, freq.score$age),]
   score gender age
 2     12      F  12
10    15      F  34
 8     56      F  35
12    23      F  43
 4     54      F  45
 6     23      F  56
 7      4      M  17
 1     32      M  23
 5     98      M  23
 9     12      M  32
 3     45      M  34
11    65      M  65



12. Implicit loops (함수의 반복 적용) 

10명의 검사요원에게 제품의 주요특성 10가지에 대한 강도를 평가하여 데이터프레임 구조(10개의 변수 포함)로 정리된 경우를 가정해보자. 변수 각각의 평균 값을 계산하기 위해서는 앞서 소개했던 mean( )함수에 인자로 “dataframe$variable01”과 같이 변수이름을 바꿔가면서 명령을 내리면 된다. 아직 배우지는 않았지만 R이 프로그래밍언어로서 가지고 있는 for, do while 등의 반복구문을 사용하면 조금은 수고를 덜 수 있을 것이다. 그러나 제일 간단한 방법은 sapply(dataframe, mean) 이라는 함수를 사용해서 dataframe의 10개 변수 각각의 평균(mean)을 계산하는 함축적 반복 구문을 사용하는 것이다.

이와 유사한 작업들의 편리성 증대를 위해 R은 lapply( ), sapply( ), tapply( ), apply( )와 같은 함축적 반복 함수를 제공한다.

> Sourness <- c(8, 12, 3, 8, 9, 11, 9, 8, 4, 1, 14,2)
> Hardness <- c(6, 2, 9, 1, 7, 2, 3, 6, 2, 6, 1, 5)
> RedColor <- c(16, 22, 19, 61, 37, 22, 31, 26, 42, 34, 26, 51)
> Product <- rep(c("A", "B"), 6)
> Result1 <- data.frame(Sourness, Hardness)
> Result1
   Sourness Hardness
1         8        6
2        12        2
3         3        9
4         8        1
5         9        7
6        11        2
7         9        3
8         8        6
9         4        2
10        1        6
11       14        1
12        2        5

> Result2 <- data.frame(Sourness, Hardness, Product)
> Result2
   Sourness Hardness Product
1         8        6       A
2        12        2       B
3         3        9       A
4         8        1       B
5         9        7       A
6        11        2       B
7         9        3       A
8         8        6       B
9         4        2       A
10        1        6       B
11       14        1       A
12        2        5       B

*apply( ) 함수들을 사용할 때는 인자(arguments)로 na.rm=T를 입력해서 NA 데이터는 제외하는 것이 좋다.

> lapply(Result1, mean, na.rm=T)
$Sourness
[1] 7.416667

$Hardness
[1] 4.166667

> sapply(Result1, mean, na.rm=T)
Sourness Hardness
7.416667 4.166667

- lapply( ), sapply( )함수는 1번째 인자(데이터프레임: data frames)에 2번째 인자인 통계 함수를 적용시켜 목록(list: l) 또는 단순 테이블 (simplicity: s) 형태로 계산 결과값을 출력시킨다.

> tapply(Result2$Sourness, Result2$Product, mean)
       A        B
7.833333 7.000000

 - tapply( ) 함수는 1번째 인자(벡터: vector)를 2번째 인자(요인:factor)로 그룹화하여 각 그룹에 3번째 인자인 통계함수를 적용시켜 테이블(table: t) 형태로 결과값을 출력시킨다.


> R.Matrix <- cbind(Sourness, Hardness, RedColor)
> R.Matrix
      Sourness Hardness RedColor
 [1,]        8        6       16
 [2,]       12        2       22
 [3,]        3        9       19
 [4,]        8        1       61
 [5,]        9        7       37
 [6,]       11        2       22
 [7,]        9        3       31
 [8,]        8        6       26
 [9,]        4        2       42
[10,]        1        6       34
[11,]       14        1       26
[12,]        2        5       51

> apply(R.Matrix, 2, sum)
Sourness Hardness RedColor
      89       50      387

- apply( )함수는 1번째 행렬, 2번째 인자(1 = rows, 2 = columns) 방향, 3번째 인자인 통계함수를 적용시켜 그 결과를 출력.


* 데이터 프레임에 대한 데이터 조작은 이후의 포스팅에 sqldf 패키지를 활용한 가공/조작이 가능 합니다. 사실 어느쪽이 편한가는 사용자의 편의에 따라 달라질수 있으니 결국엔 결과값이 같은 내용이라면 본인이 선호하는 것을 선택하게 되어 있습니다. 


댓글 없음:

댓글 쓰기

언제 부터 였던가 생각해보니 아르바이트 겸 외부 컨설팅을 의뢰 받고 맥북 프로를 처음 써봤을 때 부터 였던 것 같다. 지금은 거의 대부분의 작업을 맥으로 작업을 하다 보니 윈도우에서만 실행되는 일부 프로그램들 때문과 회사 내부 ERP프로그램이 윈도우 ...