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개씩 정규분포를 따르는 난수를 발생시켰습니다.