R 활용 사용법(심화)2
##R 활용 - 사용법(심화)(2/3)
작성 2019년 12월 17일 박영훈
1. 데이타 그룹핑
데이터를 그룹별로 나눈 뒤 각 그룹별로 함수를 호출하는 방법 doBy 패키지가 필요하며 summaryBy(), orderBy(), sampleBy()와 같은 메소드를 제공한다.
install.packages("doBy")
library("doBy")
summaryBy()
그룹별로 그룹을 특징짓는 통계적 요약 값을 계산하는 함수이다. base의 summary와 비교하여 보자
> t <- read.csv("iris.csv")
> summary(t)
X150 X4 setosa versicolor virginica
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 Min. :0
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 1st Qu.:0
Median :5.800 Median :3.000 Median :4.350 Median :1.300 Median :1
Mean :5.843 Mean :3.054 Mean :3.759 Mean :1.199 Mean :1
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800 3rd Qu.:2
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500 Max. :2
iris의 Sepal.Length와 Sepal.Width를 Species에 따라 보기 위한 예제
> summaryBy(Sepal.Width + Sepal.Length ~ Species, iris)
Species Sepal.Width.mean Sepal.Length.mean
1 setosa 3.428 5.006
2 versicolor 2.770 5.936
3 virginica 2.974 6.588
orderBy()
데이타프레임을 정렬하는 목적으로 사용한다. base의 order()와 비교하여 보자
> order(iris$Sepal.Length)
[1] 14 9 39 43 42 4 7 23 48 3 30 12 13 25 31 46 2 10 35
[20] 38 58 107 5 8 26 27 36 41 44 50 61 94 1 18 20 22 24 40
[39] 45 47 99 28 29 33 60 49 6 11 17 21 32 85 34 37 54 81 82
[58] 90 91 65 67 70 89 95 122 16 19 56 80 96 97 100 114 15 68 83
[77] 93 102 115 143 62 71 150 63 79 84 86 120 139 64 72 74 92 128 135
[96] 69 98 127 149 57 73 88 101 104 124 134 137 147 52 75 112 116 129 133
[115] 138 55 105 111 117 148 59 76 66 78 87 109 125 141 145 146 77 113 144
[134] 53 121 140 142 51 103 110 126 130 108 131 106 118 119 123 136 132
14행이 처음 9행이 두번째 순으로 정렬된다고 표현하고 있다.
orderBy를 통해 같은 기준으로 정렬하여 보자
> orderBy(~ Sepal.Width, iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
61 5.0 2.0 3.5 1.0 versicolor
63 6.0 2.2 4.0 1.0 versicolor
69 6.2 2.2 4.5 1.5 versicolor
120 6.0 2.2 5.0 1.5 virginica
42 4.5 2.3 1.3 0.3 setosa
54 5.5 2.3 4.0 1.3 versicolor
88 6.3 2.3 4.4 1.3 versicolor
94 5.0 2.3 3.3 1.0 versicolor
58 4.9 2.4 3.3 1.0 versicolor
81 5.5 2.4 3.8 1.1 versicolor
82 5.5 2.4 3.7 1.0 versicolor
70 5.6 2.5 3.9 1.1 versicolor
73 6.3 2.5 4.9 1.5 versicolor
90 5.5 2.5 4.0 1.3 versicolor
sampleBy()
데이터를 그룹으로 묶은 후 각 그룹에서 샘플을 추출하는 함수이다. base의 sample()과 비교하여 보자
1부터 10중에 10개의 샘플을 추출하는 예제이다.
> sample(1:10 , 10)
[1] 4 1 3 10 7 6 9 8 2 5
다음은 iris 데이타에서 각 Species 별로 10%의 데이타를 추출하는 예제이다.
> sampleBy(~Species, frac=0.1, data=iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
setosa.8 5.0 3.4 1.5 0.2 setosa
setosa.9 4.4 2.9 1.4 0.2 setosa
setosa.14 4.3 3.0 1.1 0.1 setosa
setosa.22 5.1 3.7 1.5 0.4 setosa
setosa.50 5.0 3.3 1.4 0.2 setosa
versicolor.51 7.0 3.2 4.7 1.4 versicolor
versicolor.53 6.9 3.1 4.9 1.5 versicolor
versicolor.61 5.0 2.0 3.5 1.0 versicolor
versicolor.68 5.8 2.7 4.1 1.0 versicolor
versicolor.97 5.7 2.9 4.2 1.3 versicolor
virginica.109 6.7 2.5 5.8 1.8 virginica
virginica.118 7.7 3.8 6.7 2.2 virginica
virginica.130 7.2 3.0 5.8 1.6 virginica
virginica.139 6.0 3.0 4.8 1.8 virginica
virginica.150 5.9 3.0 5.1 1.8 virginica
Species가 3종류이고 데이터가 150개 이므로 기준을 Species로 했기 때문에 각 종류별 샘플 데이타 5개씩을 추출하였다.
2.데이터 분리 및 병합
데이터를 조건에 따라 분리하는 split(), subset()가 있고 데이터를 공통된 값에 따라 병합하는 merge()가 있다.
split()
조건에 따라 데이타를 분리하는데 사용한다.
> split(iris, iris$Species)
$setosa
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
...
$versicolor
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
51 7.0 3.2 4.7 1.4 versicolor
52 6.4 3.2 4.5 1.5 versicolor
53 6.9 3.1 4.9 1.5 versicolor
54 5.5 2.3 4.0 1.3 versicolor
55 6.5 2.8 4.6 1.5 versicolor
...
$virginica
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
101 6.3 3.3 6.0 2.5 virginica
102 5.8 2.7 5.1 1.9 virginica
103 7.1 3.0 5.9 2.1 virginica
104 6.3 2.9 5.6 1.8 virginica
105 6.5 3.0 5.8 2.2 virginica
106 7.6 3.0 6.6 2.1 virginica
107 4.9 2.5 4.5 1.7 virginica
subset()
subset()은 전체를 부분으로 구분하는 대신 조건을 만족하는 특정 부분만 취하는 용도로 사용한다.
iris에서 Species가 setosa인것만 분리 > subset(iris, Species==”setosa”) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa …
merge()
두 데이터 프레임을 공통된 값을 기준으로 묶는 함수이다.
데이터 프레임에서 merge하는 예제이다.
> x <- data.frame(name=c("a","b","c"), math=c(1,2,3))
> y <- data.frame(name=c("a","b","d"), english=c(4,5,6))
> merge(x, y)
name math english
1 a 1 4
2 b 2 5
> merge(x, y, all=TRUE)
name math english
1 a 1 4
2 b 2 5
3 c 3 NA
4 d NA 6
옵션 TRUE를 주면 합집합으로 계산되고 FALSE면 교집합으로 계산된다.
3.데이터 정렬
주어진 데이터를 직접 정렬해주는 sort()와 데이터를 정렬했을 때의 순서를 반환하는 order가 있다.
> x <- c(20, 1, 10, 5)
> sort(x, decreasing=TRUE)
[1] 20 10 5 1
> order(x)
[1] 2 4 3 1
sort는 값을 반환하고 order는 index값을 반환한다.
4.데이터 프레임 컬럼 접근
데이터 프레임에 저장된 컬럼을 $컬럼을 사용하지 않고 컬럼이름으로 접근할 수 있는 함수이다.
with()
데이터 프레임 또는 리스트 내 필드를 필드 이름만으로 접근할 수 있게 해주는 함수이다.
> print(mean(iris$Sepal.Length))
[1] 5.843333
> with(iris, {print(mean(Sepal.Length))})
[1] 5.843333
within()
with와 유사하지만 데이터를 수정하는 기능을 제공한다.
> data(iris)
> iris[1,1] = NA
> iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 NA 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
...
> med <- sapply(split(iris$Sepal.Length, iris$Species), median, na.rm = TRUE)
> iris <- within(iris, {Sepal.Length <- ifelse(is.na(Sepal.Length), med[Species], Sepal.Length)})
> iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.0 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
NA값이 within 함수안에서 변경된 것을 확인할 수 있다.
attach(),detach()
함수 호출 후 모든 코드에서 컬럼들을 직접 접근할 수 있게한다.
> Sepal.Width
에러: 객체 'Sepal.Width'를 찾을 수 없습니다
> attach(iris)
> head(Sepal.Width)
[1] 3.5 3.0 3.2 3.1 3.6 3.9
> detach(iris)
> Sepal.Width
에러: 객체 'Sepal.Width'를 찾을 수 없습니다
5.조건에 맞는 데이터 색인
subset을 이용하면 데이터 값 자체를 얻을 수 있으나 색인값을 얻기 위해서는 which 함수를 이용한다.
> which.max(iris$Sepal.Length)
[1] 132
> which.min(iris$Sepal.Length)
[1] 14