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