Apply

1.소개 matrix 에 대해 row/column별로 function을 적용해야 할 필요가 있다.

예를 들어 matrix A에 대해 각 column 별로 최소값을 구하고자 min()이라는 함수를 적용시켜 보면,

min(A) a 결과는 최소 element 하나만 나오게 된다.

이럴 때 apply()를 사용하면 row/column 별로 원하는 함수값을 구할수있다.

2.사용법

apply(X, MARGIN, FUN, …) : MARGIN = 1 이면 Row/ 2이면 Column에 대해 적용시킨다.


apply

x <- iris[1:4]
attach(x)

## MA
apply(x, 2, mean)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##        5.843        3.057        3.758        1.199
apply(x, 2, function(x) x/2)
##        Sepal.Length Sepal.Width Petal.Length Petal.Width
##   [1,]         2.55        1.75         0.70        0.10
##   [2,]         2.45        1.50         0.70        0.10
##   [3,]         2.35        1.60         0.65        0.10
##   [4,]         2.30        1.55         0.75        0.10
##   [5,]         2.50        1.80         0.70        0.10
##   [6,]         2.70        1.95         0.85        0.20
##   [7,]         2.30        1.70         0.70        0.15
##   [8,]         2.50        1.70         0.75        0.10
##   [9,]         2.20        1.45         0.70        0.10
##  [10,]         2.45        1.55         0.75        0.05
##  [11,]         2.70        1.85         0.75        0.10
##  [12,]         2.40        1.70         0.80        0.10
##  [13,]         2.40        1.50         0.70        0.05
##  [14,]         2.15        1.50         0.55        0.05
##  [15,]         2.90        2.00         0.60        0.10
##  [16,]         2.85        2.20         0.75        0.20
##  [17,]         2.70        1.95         0.65        0.20
##  [18,]         2.55        1.75         0.70        0.15
##  [19,]         2.85        1.90         0.85        0.15
##  [20,]         2.55        1.90         0.75        0.15
##  [21,]         2.70        1.70         0.85        0.10
##  [22,]         2.55        1.85         0.75        0.20
##  [23,]         2.30        1.80         0.50        0.10
##  [24,]         2.55        1.65         0.85        0.25
##  [25,]         2.40        1.70         0.95        0.10
##  [26,]         2.50        1.50         0.80        0.10
##  [27,]         2.50        1.70         0.80        0.20
##  [28,]         2.60        1.75         0.75        0.10
##  [29,]         2.60        1.70         0.70        0.10
##  [30,]         2.35        1.60         0.80        0.10
##  [31,]         2.40        1.55         0.80        0.10
##  [32,]         2.70        1.70         0.75        0.20
##  [33,]         2.60        2.05         0.75        0.05
##  [34,]         2.75        2.10         0.70        0.10
##  [35,]         2.45        1.55         0.75        0.10
##  [36,]         2.50        1.60         0.60        0.10
##  [37,]         2.75        1.75         0.65        0.10
##  [38,]         2.45        1.80         0.70        0.05
##  [39,]         2.20        1.50         0.65        0.10
##  [40,]         2.55        1.70         0.75        0.10
##  [41,]         2.50        1.75         0.65        0.15
##  [42,]         2.25        1.15         0.65        0.15
##  [43,]         2.20        1.60         0.65        0.10
##  [44,]         2.50        1.75         0.80        0.30
##  [45,]         2.55        1.90         0.95        0.20
##  [46,]         2.40        1.50         0.70        0.15
##  [47,]         2.55        1.90         0.80        0.10
##  [48,]         2.30        1.60         0.70        0.10
##  [49,]         2.65        1.85         0.75        0.10
##  [50,]         2.50        1.65         0.70        0.10
##  [51,]         3.50        1.60         2.35        0.70
##  [52,]         3.20        1.60         2.25        0.75
##  [53,]         3.45        1.55         2.45        0.75
##  [54,]         2.75        1.15         2.00        0.65
##  [55,]         3.25        1.40         2.30        0.75
##  [56,]         2.85        1.40         2.25        0.65
##  [57,]         3.15        1.65         2.35        0.80
##  [58,]         2.45        1.20         1.65        0.50
##  [59,]         3.30        1.45         2.30        0.65
##  [60,]         2.60        1.35         1.95        0.70
##  [61,]         2.50        1.00         1.75        0.50
##  [62,]         2.95        1.50         2.10        0.75
##  [63,]         3.00        1.10         2.00        0.50
##  [64,]         3.05        1.45         2.35        0.70
##  [65,]         2.80        1.45         1.80        0.65
##  [66,]         3.35        1.55         2.20        0.70
##  [67,]         2.80        1.50         2.25        0.75
##  [68,]         2.90        1.35         2.05        0.50
##  [69,]         3.10        1.10         2.25        0.75
##  [70,]         2.80        1.25         1.95        0.55
##  [71,]         2.95        1.60         2.40        0.90
##  [72,]         3.05        1.40         2.00        0.65
##  [73,]         3.15        1.25         2.45        0.75
##  [74,]         3.05        1.40         2.35        0.60
##  [75,]         3.20        1.45         2.15        0.65
##  [76,]         3.30        1.50         2.20        0.70
##  [77,]         3.40        1.40         2.40        0.70
##  [78,]         3.35        1.50         2.50        0.85
##  [79,]         3.00        1.45         2.25        0.75
##  [80,]         2.85        1.30         1.75        0.50
##  [81,]         2.75        1.20         1.90        0.55
##  [82,]         2.75        1.20         1.85        0.50
##  [83,]         2.90        1.35         1.95        0.60
##  [84,]         3.00        1.35         2.55        0.80
##  [85,]         2.70        1.50         2.25        0.75
##  [86,]         3.00        1.70         2.25        0.80
##  [87,]         3.35        1.55         2.35        0.75
##  [88,]         3.15        1.15         2.20        0.65
##  [89,]         2.80        1.50         2.05        0.65
##  [90,]         2.75        1.25         2.00        0.65
##  [91,]         2.75        1.30         2.20        0.60
##  [92,]         3.05        1.50         2.30        0.70
##  [93,]         2.90        1.30         2.00        0.60
##  [94,]         2.50        1.15         1.65        0.50
##  [95,]         2.80        1.35         2.10        0.65
##  [96,]         2.85        1.50         2.10        0.60
##  [97,]         2.85        1.45         2.10        0.65
##  [98,]         3.10        1.45         2.15        0.65
##  [99,]         2.55        1.25         1.50        0.55
## [100,]         2.85        1.40         2.05        0.65
## [101,]         3.15        1.65         3.00        1.25
## [102,]         2.90        1.35         2.55        0.95
## [103,]         3.55        1.50         2.95        1.05
## [104,]         3.15        1.45         2.80        0.90
## [105,]         3.25        1.50         2.90        1.10
## [106,]         3.80        1.50         3.30        1.05
## [107,]         2.45        1.25         2.25        0.85
## [108,]         3.65        1.45         3.15        0.90
## [109,]         3.35        1.25         2.90        0.90
## [110,]         3.60        1.80         3.05        1.25
## [111,]         3.25        1.60         2.55        1.00
## [112,]         3.20        1.35         2.65        0.95
## [113,]         3.40        1.50         2.75        1.05
## [114,]         2.85        1.25         2.50        1.00
## [115,]         2.90        1.40         2.55        1.20
## [116,]         3.20        1.60         2.65        1.15
## [117,]         3.25        1.50         2.75        0.90
## [118,]         3.85        1.90         3.35        1.10
## [119,]         3.85        1.30         3.45        1.15
## [120,]         3.00        1.10         2.50        0.75
## [121,]         3.45        1.60         2.85        1.15
## [122,]         2.80        1.40         2.45        1.00
## [123,]         3.85        1.40         3.35        1.00
## [124,]         3.15        1.35         2.45        0.90
## [125,]         3.35        1.65         2.85        1.05
## [126,]         3.60        1.60         3.00        0.90
## [127,]         3.10        1.40         2.40        0.90
## [128,]         3.05        1.50         2.45        0.90
## [129,]         3.20        1.40         2.80        1.05
## [130,]         3.60        1.50         2.90        0.80
## [131,]         3.70        1.40         3.05        0.95
## [132,]         3.95        1.90         3.20        1.00
## [133,]         3.20        1.40         2.80        1.10
## [134,]         3.15        1.40         2.55        0.75
## [135,]         3.05        1.30         2.80        0.70
## [136,]         3.85        1.50         3.05        1.15
## [137,]         3.15        1.70         2.80        1.20
## [138,]         3.20        1.55         2.75        0.90
## [139,]         3.00        1.50         2.40        0.90
## [140,]         3.45        1.55         2.70        1.05
## [141,]         3.35        1.55         2.80        1.20
## [142,]         3.45        1.55         2.55        1.15
## [143,]         2.90        1.35         2.55        0.95
## [144,]         3.40        1.60         2.95        1.15
## [145,]         3.35        1.65         2.85        1.25
## [146,]         3.35        1.50         2.60        1.15
## [147,]         3.15        1.25         2.50        0.95
## [148,]         3.25        1.50         2.60        1.00
## [149,]         3.10        1.70         2.70        1.15
## [150,]         2.95        1.50         2.55        0.90
apply(x, 2, sort)  #크기 순으로 정렬
##        Sepal.Length Sepal.Width Petal.Length Petal.Width
##   [1,]          4.3         2.0          1.0         0.1
##   [2,]          4.4         2.2          1.1         0.1
##   [3,]          4.4         2.2          1.2         0.1
##   [4,]          4.4         2.2          1.2         0.1
##   [5,]          4.5         2.3          1.3         0.1
##   [6,]          4.6         2.3          1.3         0.2
##   [7,]          4.6         2.3          1.3         0.2
##   [8,]          4.6         2.3          1.3         0.2
##   [9,]          4.6         2.4          1.3         0.2
##  [10,]          4.7         2.4          1.3         0.2
##  [11,]          4.7         2.4          1.3         0.2
##  [12,]          4.8         2.5          1.4         0.2
##  [13,]          4.8         2.5          1.4         0.2
##  [14,]          4.8         2.5          1.4         0.2
##  [15,]          4.8         2.5          1.4         0.2
##  [16,]          4.8         2.5          1.4         0.2
##  [17,]          4.9         2.5          1.4         0.2
##  [18,]          4.9         2.5          1.4         0.2
##  [19,]          4.9         2.5          1.4         0.2
##  [20,]          4.9         2.6          1.4         0.2
##  [21,]          4.9         2.6          1.4         0.2
##  [22,]          4.9         2.6          1.4         0.2
##  [23,]          5.0         2.6          1.4         0.2
##  [24,]          5.0         2.6          1.4         0.2
##  [25,]          5.0         2.7          1.5         0.2
##  [26,]          5.0         2.7          1.5         0.2
##  [27,]          5.0         2.7          1.5         0.2
##  [28,]          5.0         2.7          1.5         0.2
##  [29,]          5.0         2.7          1.5         0.2
##  [30,]          5.0         2.7          1.5         0.2
##  [31,]          5.0         2.7          1.5         0.2
##  [32,]          5.0         2.7          1.5         0.2
##  [33,]          5.1         2.7          1.5         0.2
##  [34,]          5.1         2.8          1.5         0.2
##  [35,]          5.1         2.8          1.5         0.3
##  [36,]          5.1         2.8          1.5         0.3
##  [37,]          5.1         2.8          1.5         0.3
##  [38,]          5.1         2.8          1.6         0.3
##  [39,]          5.1         2.8          1.6         0.3
##  [40,]          5.1         2.8          1.6         0.3
##  [41,]          5.1         2.8          1.6         0.3
##  [42,]          5.2         2.8          1.6         0.4
##  [43,]          5.2         2.8          1.6         0.4
##  [44,]          5.2         2.8          1.6         0.4
##  [45,]          5.2         2.8          1.7         0.4
##  [46,]          5.3         2.8          1.7         0.4
##  [47,]          5.4         2.8          1.7         0.4
##  [48,]          5.4         2.9          1.7         0.4
##  [49,]          5.4         2.9          1.9         0.5
##  [50,]          5.4         2.9          1.9         0.6
##  [51,]          5.4         2.9          3.0         1.0
##  [52,]          5.4         2.9          3.3         1.0
##  [53,]          5.5         2.9          3.3         1.0
##  [54,]          5.5         2.9          3.5         1.0
##  [55,]          5.5         2.9          3.5         1.0
##  [56,]          5.5         2.9          3.6         1.0
##  [57,]          5.5         2.9          3.7         1.0
##  [58,]          5.5         3.0          3.8         1.1
##  [59,]          5.5         3.0          3.9         1.1
##  [60,]          5.6         3.0          3.9         1.1
##  [61,]          5.6         3.0          3.9         1.2
##  [62,]          5.6         3.0          4.0         1.2
##  [63,]          5.6         3.0          4.0         1.2
##  [64,]          5.6         3.0          4.0         1.2
##  [65,]          5.6         3.0          4.0         1.2
##  [66,]          5.7         3.0          4.0         1.3
##  [67,]          5.7         3.0          4.1         1.3
##  [68,]          5.7         3.0          4.1         1.3
##  [69,]          5.7         3.0          4.1         1.3
##  [70,]          5.7         3.0          4.2         1.3
##  [71,]          5.7         3.0          4.2         1.3
##  [72,]          5.7         3.0          4.2         1.3
##  [73,]          5.7         3.0          4.2         1.3
##  [74,]          5.8         3.0          4.3         1.3
##  [75,]          5.8         3.0          4.3         1.3
##  [76,]          5.8         3.0          4.4         1.3
##  [77,]          5.8         3.0          4.4         1.3
##  [78,]          5.8         3.0          4.4         1.3
##  [79,]          5.8         3.0          4.4         1.4
##  [80,]          5.8         3.0          4.5         1.4
##  [81,]          5.9         3.0          4.5         1.4
##  [82,]          5.9         3.0          4.5         1.4
##  [83,]          5.9         3.0          4.5         1.4
##  [84,]          6.0         3.1          4.5         1.4
##  [85,]          6.0         3.1          4.5         1.4
##  [86,]          6.0         3.1          4.5         1.4
##  [87,]          6.0         3.1          4.5         1.5
##  [88,]          6.0         3.1          4.6         1.5
##  [89,]          6.0         3.1          4.6         1.5
##  [90,]          6.1         3.1          4.6         1.5
##  [91,]          6.1         3.1          4.7         1.5
##  [92,]          6.1         3.1          4.7         1.5
##  [93,]          6.1         3.1          4.7         1.5
##  [94,]          6.1         3.1          4.7         1.5
##  [95,]          6.1         3.2          4.7         1.5
##  [96,]          6.2         3.2          4.8         1.5
##  [97,]          6.2         3.2          4.8         1.5
##  [98,]          6.2         3.2          4.8         1.5
##  [99,]          6.2         3.2          4.8         1.6
## [100,]          6.3         3.2          4.9         1.6
## [101,]          6.3         3.2          4.9         1.6
## [102,]          6.3         3.2          4.9         1.6
## [103,]          6.3         3.2          4.9         1.7
## [104,]          6.3         3.2          4.9         1.7
## [105,]          6.3         3.2          5.0         1.8
## [106,]          6.3         3.2          5.0         1.8
## [107,]          6.3         3.2          5.0         1.8
## [108,]          6.3         3.3          5.0         1.8
## [109,]          6.4         3.3          5.1         1.8
## [110,]          6.4         3.3          5.1         1.8
## [111,]          6.4         3.3          5.1         1.8
## [112,]          6.4         3.3          5.1         1.8
## [113,]          6.4         3.3          5.1         1.8
## [114,]          6.4         3.4          5.1         1.8
## [115,]          6.4         3.4          5.1         1.8
## [116,]          6.5         3.4          5.1         1.8
## [117,]          6.5         3.4          5.2         1.9
## [118,]          6.5         3.4          5.2         1.9
## [119,]          6.5         3.4          5.3         1.9
## [120,]          6.5         3.4          5.3         1.9
## [121,]          6.6         3.4          5.4         1.9
## [122,]          6.6         3.4          5.4         2.0
## [123,]          6.7         3.4          5.5         2.0
## [124,]          6.7         3.4          5.5         2.0
## [125,]          6.7         3.4          5.5         2.0
## [126,]          6.7         3.5          5.6         2.0
## [127,]          6.7         3.5          5.6         2.0
## [128,]          6.7         3.5          5.6         2.1
## [129,]          6.7         3.5          5.6         2.1
## [130,]          6.7         3.5          5.6         2.1
## [131,]          6.8         3.5          5.6         2.1
## [132,]          6.8         3.6          5.7         2.1
## [133,]          6.8         3.6          5.7         2.1
## [134,]          6.9         3.6          5.7         2.2
## [135,]          6.9         3.6          5.8         2.2
## [136,]          6.9         3.7          5.8         2.2
## [137,]          6.9         3.7          5.8         2.3
## [138,]          7.0         3.7          5.9         2.3
## [139,]          7.1         3.8          5.9         2.3
## [140,]          7.2         3.8          6.0         2.3
## [141,]          7.2         3.8          6.0         2.3
## [142,]          7.2         3.8          6.1         2.3
## [143,]          7.3         3.8          6.1         2.3
## [144,]          7.4         3.8          6.1         2.3
## [145,]          7.6         3.9          6.3         2.4
## [146,]          7.7         3.9          6.4         2.4
## [147,]          7.7         4.0          6.6         2.4
## [148,]          7.7         4.1          6.7         2.5
## [149,]          7.7         4.2          6.7         2.5
## [150,]          7.9         4.4          6.9         2.5
apply(x, 2, max)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##          7.9          4.4          6.9          2.5
apply(x, 2, range)
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,]          4.3         2.0          1.0         0.1
## [2,]          7.9         4.4          6.9         2.5
apply(x, 2, stats::quantile)
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
## 0%            4.3         2.0         1.00         0.1
## 25%           5.1         2.8         1.60         0.3
## 50%           5.8         3.0         4.35         1.3
## 75%           6.4         3.3         5.10         1.8
## 100%          7.9         4.4         6.90         2.5

apply(X, MARGIN, FUN) FUN에는 mean,sum,sort,min,max,range,stats::quantile 등 다양한 형태의 함수를 쓸수있다.





##eapply 에서는 한 dataset이 아닌 다른 dataset과 같이 쓸수있다. new.env()로 새로운 data를 만들어 사용한다.

e <- new.env()
e$a <- Sepal.Length
e$b <- Sepal.Width
e$c <- Petal.Length
e$d <- Petal.Width
e$e <- cars$speed
eapply(e, mean)
## $a
## [1] 5.843
## 
## $b
## [1] 3.057
## 
## $c
## [1] 3.758
## 
## $d
## [1] 1.199
## 
## $e
## [1] 15.4




#lapply : list 형태로 결과가 나온다.

lapply(x, mean)
## $Sepal.Length
## [1] 5.843
## 
## $Sepal.Width
## [1] 3.057
## 
## $Petal.Length
## [1] 3.758
## 
## $Petal.Width
## [1] 1.199
lapply(x, quantile, probs = 1:3/4)
## $Sepal.Length
## 25% 50% 75% 
## 5.1 5.8 6.4 
## 
## $Sepal.Width
## 25% 50% 75% 
## 2.8 3.0 3.3 
## 
## $Petal.Length
##  25%  50%  75% 
## 1.60 4.35 5.10 
## 
## $Petal.Width
## 25% 50% 75% 
## 0.3 1.3 1.8
lapply(x, max)
## $Sepal.Length
## [1] 7.9
## 
## $Sepal.Width
## [1] 4.4
## 
## $Petal.Length
## [1] 6.9
## 
## $Petal.Width
## [1] 2.5




#mapply :column 별로 함수값을 계산할수있다.

a1:1 2 3 4 5 6 7 8 9 10
b1:11 12 13 14 15 16 17 18 19 20
c1:21 22 23 24 25 26 27 28 29 30
d1:31 32 33 34 35 36 37 38 39 40
(변수의 길이가 같아야한다.)


x1 <- list(a1 = c(1:10), b1 = c(11:20))
y1 <- list(c1 = c(21:30), d1 = c(31:40))
mapply(sum, x1$a, x1$b, y1$c, y1$d)
##  [1]  64  68  72  76  80  84  88  92  96 100

# ex)100씩 더할때
mapply(sum, x1$a, x1$b, y1$c, y1$d, 100)
##  [1] 164 168 172 176 180 184 188 192 196 200

# 변수 x를 4부터1까지 순서대로 1-4번 반복 나열한다.
mapply(rep, times = 1:4, x = 4:1)
## [[1]]
## [1] 4
## 
## [[2]]
## [1] 3 3
## 
## [[3]]
## [1] 2 2 2
## 
## [[4]]
## [1] 1 1 1 1
mapply(mean, x)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##        5.843        3.057        3.758        1.199




##vapply
vapply는 sapply와 비슷하고 실제 큰차이가 없다고 한다.

vapply(x, fivenum, c(Min. = 0, `1sit Qu.` = 0, Median = 0, `3rd Qu` = 0, Max. = 0))
##          Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min.              4.3         2.0         1.00         0.1
## 1sit Qu.          5.1         2.8         1.60         0.3
## Median            5.8         3.0         4.35         1.3
## 3rd Qu            6.4         3.3         5.10         1.8
## Max.              7.9         4.4         6.90         2.5
sapply(x, fivenum)
##      Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,]          4.3         2.0         1.00         0.1
## [2,]          5.1         2.8         1.60         0.3
## [3,]          5.8         3.0         4.35         1.3
## [4,]          6.4         3.3         5.10         1.8
## [5,]          7.9         4.4         6.90         2.5




##sapply list형식이 아닌 vector 형식으로 결과값으로 출력한다. lapply와 비슷하지만 결과를 볼때 편할수있다. sapply(x,mean,simplify=F,USE.NAMES=F) 뒤에 옵션을 추가한다면 lapply(x,mean)와 같은 output으로 나온다.

sapply(x, mean)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##        5.843        3.057        3.758        1.199
sapply(x, mean, simplify = F, USE.NAMES = F)
## $Sepal.Length
## [1] 5.843
## 
## $Sepal.Width
## [1] 3.057
## 
## $Petal.Length
## [1] 3.758
## 
## $Petal.Width
## [1] 1.199
lapply(x, mean)
## $Sepal.Length
## [1] 5.843
## 
## $Sepal.Width
## [1] 3.057
## 
## $Petal.Length
## [1] 3.758
## 
## $Petal.Width
## [1] 1.199




##tapply(x,index,fun) 예)tapply(Sepal.Length,iris$Species,mean) iris데이터의 Species의 요소인 setosa,versicolor,virginica를 변수Sepal.Length의 자료를 지정된 function을 계산한다. 이때 Sepal.Length 와 iris$Species 두변수의 길이는 같아야한다.

tapply(Sepal.Length, iris$Species, mean)
##     setosa versicolor  virginica 
##      5.006      5.936      6.588
tapply(Sepal.Length, iris$Species, max)
##     setosa versicolor  virginica 
##        5.8        7.0        7.9