R을 이용한 데이터처리 & 분석실무 책을 참고로 합니다. 정확한 지식은 책을 통해 얻으시길 바랍니다
library(plyr)
plyr package는 데이터를 분할한 뒤 분할된 데이터에 특정 함수를 적용하고 그 결과를 재조합하는 3 단계로 데이터를 처리하는 함수들을 제공합니다.
plyr의 데이터 처리 함수들은 {adl} {adl_} ply 형태의 5글자 함수명을 사용합니다.첫 번째 { } 안에는 입력 데이터 타입에 따라 (a) array, (d) dataframe, (l) list로 정해집니다.
두 번째 { } 안에는 출력 데이터 타입으로 a, d, l 중 선택하며 _을 입력할 경우 아무런 출력도 내보내지 않습니다.
Ex. adply() : 입력이 array, 출력은 dataframe 입니다.
1. adply
adply()는 array를 받아 dataframe을 반환하는 함수입니다. 입력이 반드시 array라기 보다는 주어진 입력 데이터가 행렬처럼 다룰 수 있는 형태의 데이터인지 확인합니다. 따라서 dataframe도 적용할 수 있습니다.
apply() 함수와 비슷해보이나 큰 차이가 있습니다. apply()함수는 한 가지 타입만 저장할 수 있는 matrix 형태의 결과를 반환합니다. 따라서 숫자와 문자가 섞이면 데이터가 모두 문자로 바뀝니다.
하지만 adply()를 사용하여 결과를 dataframe으로 변환 시 타입이 모두 문자로 바뀌는 현상을 피할 수 있습니다.
head(
adply(iris, 1, function(row) {
row$Sepal.Length >= 5.0 & row$Species == "setosa"
})
)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species V1
## 1 5.1 3.5 1.4 0.2 setosa TRUE
## 2 4.9 3.0 1.4 0.2 setosa FALSE
## 3 4.7 3.2 1.3 0.2 setosa FALSE
## 4 4.6 3.1 1.5 0.2 setosa FALSE
## 5 5.0 3.6 1.4 0.2 setosa TRUE
## 6 5.4 3.9 1.7 0.4 setosa TRUE
수행 결과는 boolean이며 임의의 컬럼인 V1에 저장되었습니다. 결과를 dataframe으로 얻는 만큼 해당 column의 이름을 지정할 수 있습니다.
head(
adply(iris, 1, function(row) {
data.frame(
test1 = c(row$Sepal.Length >= 5.0 & row$Species == "setosa")
)
})
)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species test1
## 1 5.1 3.5 1.4 0.2 setosa TRUE
## 2 4.9 3.0 1.4 0.2 setosa FALSE
## 3 4.7 3.2 1.3 0.2 setosa FALSE
## 4 4.6 3.1 1.5 0.2 setosa FALSE
## 5 5.0 3.6 1.4 0.2 setosa TRUE
## 6 5.4 3.9 1.7 0.4 setosa TRUE
2. ddply()
ddply()는 dataframe을 받아 dataframe을 내보내는 함수입니다. adply()는 행 또는 열 단위로 함수를 적용했다면 ddply()는 variables에 나열한 column에 따라 데이터를 나눈 뒤 함수를 적용합니다.
ddply(iris, .(Species), function(a) { data.frame(sepal.width.mean = mean(a$Sepal.Width)) })
## Species sepal.width.mean
## 1 setosa 3.428
## 2 versicolor 2.770
## 3 virginica 2.974
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
조건을 여러 개 걸고 싶다면 ,로 구분하면 됩니다,
ddply(iris, .(Species, Sepal.Length > 5.0), function(b) {
data.frame(means = mean(b$Sepal.Width))
}
)
## Species Sepal.Length > 5 means
## 1 setosa FALSE 3.203571
## 2 setosa TRUE 3.713636
## 3 versicolor FALSE 2.233333
## 4 versicolor TRUE 2.804255
## 5 virginica FALSE 2.500000
## 6 virginica TRUE 2.983673
3. transform(), mutate(), summarise(), subset()
transform() 함수는 연산 결과를 데이터 프레임의 새로운 column에 넣는 함수입니다.
ddply(iris, .(Species), transform, total = Sepal.Length + Petal.Length)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species total
## 1 5.1 3.5 1.4 0.2 setosa 6.5
## 2 4.9 3.0 1.4 0.2 setosa 6.3
## 3 4.7 3.2 1.3 0.2 setosa 6.0
## 4 4.6 3.1 1.5 0.2 setosa 6.1
## 5 5.0 3.6 1.4 0.2 setosa 6.4
## 6 5.4 3.9 1.7 0.4 setosa 7.1
## 7 4.6 3.4 1.4 0.3 setosa 6.0
## 8 5.0 3.4 1.5 0.2 setosa 6.5
## 9 4.4 2.9 1.4 0.2 setosa 5.8
## 10 4.9 3.1 1.5 0.1 setosa 6.4
## 11 5.4 3.7 1.5 0.2 setosa 6.9
## 12 4.8 3.4 1.6 0.2 setosa 6.4
## 13 4.8 3.0 1.4 0.1 setosa 6.2
## 14 4.3 3.0 1.1 0.1 setosa 5.4
## 15 5.8 4.0 1.2 0.2 setosa 7.0
## 16 5.7 4.4 1.5 0.4 setosa 7.2
## 17 5.4 3.9 1.3 0.4 setosa 6.7
## 18 5.1 3.5 1.4 0.3 setosa 6.5
## 19 5.7 3.8 1.7 0.3 setosa 7.4
## 20 5.1 3.8 1.5 0.3 setosa 6.6
## 21 5.4 3.4 1.7 0.2 setosa 7.1
## 22 5.1 3.7 1.5 0.4 setosa 6.6
## 23 4.6 3.6 1.0 0.2 setosa 5.6
## 24 5.1 3.3 1.7 0.5 setosa 6.8
## 25 4.8 3.4 1.9 0.2 setosa 6.7
## 26 5.0 3.0 1.6 0.2 setosa 6.6
## 27 5.0 3.4 1.6 0.4 setosa 6.6
## 28 5.2 3.5 1.5 0.2 setosa 6.7
## 29 5.2 3.4 1.4 0.2 setosa 6.6
## 30 4.7 3.2 1.6 0.2 setosa 6.3
## 31 4.8 3.1 1.6 0.2 setosa 6.4
## 32 5.4 3.4 1.5 0.4 setosa 6.9
## 33 5.2 4.1 1.5 0.1 setosa 6.7
## 34 5.5 4.2 1.4 0.2 setosa 6.9
## 35 4.9 3.1 1.5 0.2 setosa 6.4
## 36 5.0 3.2 1.2 0.2 setosa 6.2
## 37 5.5 3.5 1.3 0.2 setosa 6.8
## 38 4.9 3.6 1.4 0.1 setosa 6.3
## 39 4.4 3.0 1.3 0.2 setosa 5.7
## 40 5.1 3.4 1.5 0.2 setosa 6.6
## 41 5.0 3.5 1.3 0.3 setosa 6.3
## 42 4.5 2.3 1.3 0.3 setosa 5.8
## 43 4.4 3.2 1.3 0.2 setosa 5.7
## 44 5.0 3.5 1.6 0.6 setosa 6.6
## 45 5.1 3.8 1.9 0.4 setosa 7.0
## 46 4.8 3.0 1.4 0.3 setosa 6.2
## 47 5.1 3.8 1.6 0.2 setosa 6.7
## 48 4.6 3.2 1.4 0.2 setosa 6.0
## 49 5.3 3.7 1.5 0.2 setosa 6.8
## 50 5.0 3.3 1.4 0.2 setosa 6.4
## 51 7.0 3.2 4.7 1.4 versicolor 11.7
## 52 6.4 3.2 4.5 1.5 versicolor 10.9
## 53 6.9 3.1 4.9 1.5 versicolor 11.8
## 54 5.5 2.3 4.0 1.3 versicolor 9.5
## 55 6.5 2.8 4.6 1.5 versicolor 11.1
## 56 5.7 2.8 4.5 1.3 versicolor 10.2
## 57 6.3 3.3 4.7 1.6 versicolor 11.0
## 58 4.9 2.4 3.3 1.0 versicolor 8.2
## 59 6.6 2.9 4.6 1.3 versicolor 11.2
## 60 5.2 2.7 3.9 1.4 versicolor 9.1
## 61 5.0 2.0 3.5 1.0 versicolor 8.5
## 62 5.9 3.0 4.2 1.5 versicolor 10.1
## 63 6.0 2.2 4.0 1.0 versicolor 10.0
## 64 6.1 2.9 4.7 1.4 versicolor 10.8
## 65 5.6 2.9 3.6 1.3 versicolor 9.2
## 66 6.7 3.1 4.4 1.4 versicolor 11.1
## 67 5.6 3.0 4.5 1.5 versicolor 10.1
## 68 5.8 2.7 4.1 1.0 versicolor 9.9
## 69 6.2 2.2 4.5 1.5 versicolor 10.7
## 70 5.6 2.5 3.9 1.1 versicolor 9.5
## 71 5.9 3.2 4.8 1.8 versicolor 10.7
## 72 6.1 2.8 4.0 1.3 versicolor 10.1
## 73 6.3 2.5 4.9 1.5 versicolor 11.2
## 74 6.1 2.8 4.7 1.2 versicolor 10.8
## 75 6.4 2.9 4.3 1.3 versicolor 10.7
## 76 6.6 3.0 4.4 1.4 versicolor 11.0
## 77 6.8 2.8 4.8 1.4 versicolor 11.6
## 78 6.7 3.0 5.0 1.7 versicolor 11.7
## 79 6.0 2.9 4.5 1.5 versicolor 10.5
## 80 5.7 2.6 3.5 1.0 versicolor 9.2
## 81 5.5 2.4 3.8 1.1 versicolor 9.3
## 82 5.5 2.4 3.7 1.0 versicolor 9.2
## 83 5.8 2.7 3.9 1.2 versicolor 9.7
## 84 6.0 2.7 5.1 1.6 versicolor 11.1
## 85 5.4 3.0 4.5 1.5 versicolor 9.9
## 86 6.0 3.4 4.5 1.6 versicolor 10.5
## 87 6.7 3.1 4.7 1.5 versicolor 11.4
## 88 6.3 2.3 4.4 1.3 versicolor 10.7
## 89 5.6 3.0 4.1 1.3 versicolor 9.7
## 90 5.5 2.5 4.0 1.3 versicolor 9.5
## 91 5.5 2.6 4.4 1.2 versicolor 9.9
## 92 6.1 3.0 4.6 1.4 versicolor 10.7
## 93 5.8 2.6 4.0 1.2 versicolor 9.8
## 94 5.0 2.3 3.3 1.0 versicolor 8.3
## 95 5.6 2.7 4.2 1.3 versicolor 9.8
## 96 5.7 3.0 4.2 1.2 versicolor 9.9
## 97 5.7 2.9 4.2 1.3 versicolor 9.9
## 98 6.2 2.9 4.3 1.3 versicolor 10.5
## 99 5.1 2.5 3.0 1.1 versicolor 8.1
## 100 5.7 2.8 4.1 1.3 versicolor 9.8
## 101 6.3 3.3 6.0 2.5 virginica 12.3
## 102 5.8 2.7 5.1 1.9 virginica 10.9
## 103 7.1 3.0 5.9 2.1 virginica 13.0
## 104 6.3 2.9 5.6 1.8 virginica 11.9
## 105 6.5 3.0 5.8 2.2 virginica 12.3
## 106 7.6 3.0 6.6 2.1 virginica 14.2
## 107 4.9 2.5 4.5 1.7 virginica 9.4
## 108 7.3 2.9 6.3 1.8 virginica 13.6
## 109 6.7 2.5 5.8 1.8 virginica 12.5
## 110 7.2 3.6 6.1 2.5 virginica 13.3
## 111 6.5 3.2 5.1 2.0 virginica 11.6
## 112 6.4 2.7 5.3 1.9 virginica 11.7
## 113 6.8 3.0 5.5 2.1 virginica 12.3
## 114 5.7 2.5 5.0 2.0 virginica 10.7
## 115 5.8 2.8 5.1 2.4 virginica 10.9
## 116 6.4 3.2 5.3 2.3 virginica 11.7
## 117 6.5 3.0 5.5 1.8 virginica 12.0
## 118 7.7 3.8 6.7 2.2 virginica 14.4
## 119 7.7 2.6 6.9 2.3 virginica 14.6
## 120 6.0 2.2 5.0 1.5 virginica 11.0
## 121 6.9 3.2 5.7 2.3 virginica 12.6
## 122 5.6 2.8 4.9 2.0 virginica 10.5
## 123 7.7 2.8 6.7 2.0 virginica 14.4
## 124 6.3 2.7 4.9 1.8 virginica 11.2
## 125 6.7 3.3 5.7 2.1 virginica 12.4
## 126 7.2 3.2 6.0 1.8 virginica 13.2
## 127 6.2 2.8 4.8 1.8 virginica 11.0
## 128 6.1 3.0 4.9 1.8 virginica 11.0
## 129 6.4 2.8 5.6 2.1 virginica 12.0
## 130 7.2 3.0 5.8 1.6 virginica 13.0
## 131 7.4 2.8 6.1 1.9 virginica 13.5
## 132 7.9 3.8 6.4 2.0 virginica 14.3
## 133 6.4 2.8 5.6 2.2 virginica 12.0
## 134 6.3 2.8 5.1 1.5 virginica 11.4
## 135 6.1 2.6 5.6 1.4 virginica 11.7
## 136 7.7 3.0 6.1 2.3 virginica 13.8
## 137 6.3 3.4 5.6 2.4 virginica 11.9
## 138 6.4 3.1 5.5 1.8 virginica 11.9
## 139 6.0 3.0 4.8 1.8 virginica 10.8
## 140 6.9 3.1 5.4 2.1 virginica 12.3
## 141 6.7 3.1 5.6 2.4 virginica 12.3
## 142 6.9 3.1 5.1 2.3 virginica 12.0
## 143 5.8 2.7 5.1 1.9 virginica 10.9
## 144 6.8 3.2 5.9 2.3 virginica 12.7
## 145 6.7 3.3 5.7 2.5 virginica 12.4
## 146 6.7 3.0 5.2 2.3 virginica 11.9
## 147 6.3 2.5 5.0 1.9 virginica 11.3
## 148 6.5 3.0 5.2 2.0 virginica 11.7
## 149 6.2 3.4 5.4 2.3 virginica 11.6
## 150 5.9 3.0 5.1 1.8 virginica 11.0
mutate() 함수는 transform()을 개선한 plyr의 함수입니다. mutate() 함수는 여러 column을 dataframe에 추가할 때 바로 앞에서 추가한 column을 뒤에 추가하는 column에서 참조할 수 있어 편리합니다.
위에서 total을 Sepal과 Petal의 길이를 합쳤고 이를 그대로 받아 log 함수 값을 접목하는 column을 만들어 붙일 수 있습니다. 만약 transfomr() 함수에서 이러한 방식을 사용하면 에러가 납니다.
head(ddply(iris, .(Species), mutate, total = Sepal.Length + Petal.Length, log.total = log(total)))
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species total log.total
## 1 5.1 3.5 1.4 0.2 setosa 6.5 1.871802
## 2 4.9 3.0 1.4 0.2 setosa 6.3 1.840550
## 3 4.7 3.2 1.3 0.2 setosa 6.0 1.791759
## 4 4.6 3.1 1.5 0.2 setosa 6.1 1.808289
## 5 5.0 3.6 1.4 0.2 setosa 6.4 1.856298
## 6 5.4 3.9 1.7 0.4 setosa 7.1 1.960095
summarise() 함수는 계산 결과만을 담은 새로운 dataframe을 산출한다는 것이 transform(), mutate() 함수와 다릅니다.
만약 여러 조건을 걸고 싶다면 요약 값 계산을 ,로 이어가며 계속 나열하면 됩니다.
head(
ddply(iris, .(Species), summarise, min.Length = min(Sepal.Length), max.Length = max(Sepal.Length))
)
## Species min.Length max.Length
## 1 setosa 4.3 5.8
## 2 versicolor 4.9 7.0
## 3 virginica 4.9 7.9
subset() 함수는 추출 조건에 따라 data를 추출하는 함수입니다. iris 내 데이터를 Species에 따라 그룹화하여 나열한 뒤 Species 그룹 내 Petal.Width가 최대인 값을 갖는 행을 뽑아냅니다.
ddply(iris, .(Species), subset, Petal.Width == max(Petal.Width))
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.0 3.5 1.6 0.6 setosa
## 2 5.9 3.2 4.8 1.8 versicolor
## 3 6.3 3.3 6.0 2.5 virginica
## 4 7.2 3.6 6.1 2.5 virginica
## 5 6.7 3.3 5.7 2.5 virginica
4. mdply()
m{adl_}ply (maply(), mdply(), mlply(), m_ply()) 함수는 dataframe 또는 array를 인자로 받아 각 column에 주어진 함수를 적용하고 실행 결과들을 조합하여 표기합니다.
(x <- data.frame(mean = 1:5, sd = 1:5))
## mean sd
## 1 1 1
## 2 2 2
## 3 3 3
## 4 4 4
## 5 5 5
mdply(x, rnorm, n = 2)
## mean sd V1 V2
## 1 1 1 2.056407 1.836625
## 2 2 2 1.785015 1.141941
## 3 3 3 2.076583 2.275824
## 4 4 4 5.396816 8.588749
## 5 5 5 7.288606 2.341115
dataframe x의 두 column에 값을 집어넣고 mdply()를 활용하여 x가 갖는 mean, sd마다 2개씩 정규분포를 따르는 난수를 발생시켰습니다.