У R -у се функција дефинише на следећи начин:
IME_FJE <- function(arg1, arg2, arg3,...) {TELO FUNKCIJE}.
Функција се позива са IME_FJE(arg1, arg2,...) са
конкретним аргументима.
Ако желимо да видимо код постојећих функција, куцамо само име функције без аргумената.
factorial## function (x)
## gamma(x + 1)
## <bytecode: 0x0000000013246678>
## <environment: namespace:base>
- Функција која рачуна биномни коефицијент \(\binom{n}{k}\).
binomni <- function(n, k){
koef <- factorial(n) / (factorial(k) * factorial(n-k))
return(koef)
}Позив финкције је
binomni(4,2)## [1] 6
Када позивамо функцију, аргументе наводимо истим редом као у дефиницији функције, осим ако их наведемо по имену. Тада је редослед произвољан.
binomni(k = 2, n = 4)## [1] 6
- Функција која спаја два вектора као колоне матрице.
spoji <- function(v1, v2){
return (cbind(v1, v2))
}
# Poziv
spoji(c(0,1,2,3), seq(0,3,1))## v1 v2
## [1,] 0 0
## [2,] 1 1
## [3,] 2 2
## [4,] 3 3
Функција не мора да садржи RETURN наредбу, може само да
се направе неке измене које важе само у телу функције.
- Функција која рачуна квадрат броја
SQ <- function(x){
x <- x^2
}
a <- 3
SQ(a)
a # nije se izmenilo van funkcije## [1] 3
a <- SQ(a)
a## [1] 9
- ЗАДАТАК: Написати функцију која црта два графика \(y(x)\) и \(x(y)\) у произвољној боји.
colors() #sve postojece boje u R-u## [1] "white" "aliceblue" "antiquewhite"
## [4] "antiquewhite1" "antiquewhite2" "antiquewhite3"
## [7] "antiquewhite4" "aquamarine" "aquamarine1"
## [10] "aquamarine2" "aquamarine3" "aquamarine4"
## [13] "azure" "azure1" "azure2"
## [16] "azure3" "azure4" "beige"
## [19] "bisque" "bisque1" "bisque2"
## [22] "bisque3" "bisque4" "black"
## [25] "blanchedalmond" "blue" "blue1"
## [28] "blue2" "blue3" "blue4"
## [31] "blueviolet" "brown" "brown1"
## [34] "brown2" "brown3" "brown4"
## [37] "burlywood" "burlywood1" "burlywood2"
## [40] "burlywood3" "burlywood4" "cadetblue"
## [43] "cadetblue1" "cadetblue2" "cadetblue3"
## [46] "cadetblue4" "chartreuse" "chartreuse1"
## [49] "chartreuse2" "chartreuse3" "chartreuse4"
## [52] "chocolate" "chocolate1" "chocolate2"
## [55] "chocolate3" "chocolate4" "coral"
## [58] "coral1" "coral2" "coral3"
## [61] "coral4" "cornflowerblue" "cornsilk"
## [64] "cornsilk1" "cornsilk2" "cornsilk3"
## [67] "cornsilk4" "cyan" "cyan1"
## [70] "cyan2" "cyan3" "cyan4"
## [73] "darkblue" "darkcyan" "darkgoldenrod"
## [76] "darkgoldenrod1" "darkgoldenrod2" "darkgoldenrod3"
## [79] "darkgoldenrod4" "darkgray" "darkgreen"
## [82] "darkgrey" "darkkhaki" "darkmagenta"
## [85] "darkolivegreen" "darkolivegreen1" "darkolivegreen2"
## [88] "darkolivegreen3" "darkolivegreen4" "darkorange"
## [91] "darkorange1" "darkorange2" "darkorange3"
## [94] "darkorange4" "darkorchid" "darkorchid1"
## [97] "darkorchid2" "darkorchid3" "darkorchid4"
## [100] "darkred" "darksalmon" "darkseagreen"
## [103] "darkseagreen1" "darkseagreen2" "darkseagreen3"
## [106] "darkseagreen4" "darkslateblue" "darkslategray"
## [109] "darkslategray1" "darkslategray2" "darkslategray3"
## [112] "darkslategray4" "darkslategrey" "darkturquoise"
## [115] "darkviolet" "deeppink" "deeppink1"
## [118] "deeppink2" "deeppink3" "deeppink4"
## [121] "deepskyblue" "deepskyblue1" "deepskyblue2"
## [124] "deepskyblue3" "deepskyblue4" "dimgray"
## [127] "dimgrey" "dodgerblue" "dodgerblue1"
## [130] "dodgerblue2" "dodgerblue3" "dodgerblue4"
## [133] "firebrick" "firebrick1" "firebrick2"
## [136] "firebrick3" "firebrick4" "floralwhite"
## [139] "forestgreen" "gainsboro" "ghostwhite"
## [142] "gold" "gold1" "gold2"
## [145] "gold3" "gold4" "goldenrod"
## [148] "goldenrod1" "goldenrod2" "goldenrod3"
## [151] "goldenrod4" "gray" "gray0"
## [154] "gray1" "gray2" "gray3"
## [157] "gray4" "gray5" "gray6"
## [160] "gray7" "gray8" "gray9"
## [163] "gray10" "gray11" "gray12"
## [166] "gray13" "gray14" "gray15"
## [169] "gray16" "gray17" "gray18"
## [172] "gray19" "gray20" "gray21"
## [175] "gray22" "gray23" "gray24"
## [178] "gray25" "gray26" "gray27"
## [181] "gray28" "gray29" "gray30"
## [184] "gray31" "gray32" "gray33"
## [187] "gray34" "gray35" "gray36"
## [190] "gray37" "gray38" "gray39"
## [193] "gray40" "gray41" "gray42"
## [196] "gray43" "gray44" "gray45"
## [199] "gray46" "gray47" "gray48"
## [202] "gray49" "gray50" "gray51"
## [205] "gray52" "gray53" "gray54"
## [208] "gray55" "gray56" "gray57"
## [211] "gray58" "gray59" "gray60"
## [214] "gray61" "gray62" "gray63"
## [217] "gray64" "gray65" "gray66"
## [220] "gray67" "gray68" "gray69"
## [223] "gray70" "gray71" "gray72"
## [226] "gray73" "gray74" "gray75"
## [229] "gray76" "gray77" "gray78"
## [232] "gray79" "gray80" "gray81"
## [235] "gray82" "gray83" "gray84"
## [238] "gray85" "gray86" "gray87"
## [241] "gray88" "gray89" "gray90"
## [244] "gray91" "gray92" "gray93"
## [247] "gray94" "gray95" "gray96"
## [250] "gray97" "gray98" "gray99"
## [253] "gray100" "green" "green1"
## [256] "green2" "green3" "green4"
## [259] "greenyellow" "grey" "grey0"
## [262] "grey1" "grey2" "grey3"
## [265] "grey4" "grey5" "grey6"
## [268] "grey7" "grey8" "grey9"
## [271] "grey10" "grey11" "grey12"
## [274] "grey13" "grey14" "grey15"
## [277] "grey16" "grey17" "grey18"
## [280] "grey19" "grey20" "grey21"
## [283] "grey22" "grey23" "grey24"
## [286] "grey25" "grey26" "grey27"
## [289] "grey28" "grey29" "grey30"
## [292] "grey31" "grey32" "grey33"
## [295] "grey34" "grey35" "grey36"
## [298] "grey37" "grey38" "grey39"
## [301] "grey40" "grey41" "grey42"
## [304] "grey43" "grey44" "grey45"
## [307] "grey46" "grey47" "grey48"
## [310] "grey49" "grey50" "grey51"
## [313] "grey52" "grey53" "grey54"
## [316] "grey55" "grey56" "grey57"
## [319] "grey58" "grey59" "grey60"
## [322] "grey61" "grey62" "grey63"
## [325] "grey64" "grey65" "grey66"
## [328] "grey67" "grey68" "grey69"
## [331] "grey70" "grey71" "grey72"
## [334] "grey73" "grey74" "grey75"
## [337] "grey76" "grey77" "grey78"
## [340] "grey79" "grey80" "grey81"
## [343] "grey82" "grey83" "grey84"
## [346] "grey85" "grey86" "grey87"
## [349] "grey88" "grey89" "grey90"
## [352] "grey91" "grey92" "grey93"
## [355] "grey94" "grey95" "grey96"
## [358] "grey97" "grey98" "grey99"
## [361] "grey100" "honeydew" "honeydew1"
## [364] "honeydew2" "honeydew3" "honeydew4"
## [367] "hotpink" "hotpink1" "hotpink2"
## [370] "hotpink3" "hotpink4" "indianred"
## [373] "indianred1" "indianred2" "indianred3"
## [376] "indianred4" "ivory" "ivory1"
## [379] "ivory2" "ivory3" "ivory4"
## [382] "khaki" "khaki1" "khaki2"
## [385] "khaki3" "khaki4" "lavender"
## [388] "lavenderblush" "lavenderblush1" "lavenderblush2"
## [391] "lavenderblush3" "lavenderblush4" "lawngreen"
## [394] "lemonchiffon" "lemonchiffon1" "lemonchiffon2"
## [397] "lemonchiffon3" "lemonchiffon4" "lightblue"
## [400] "lightblue1" "lightblue2" "lightblue3"
## [403] "lightblue4" "lightcoral" "lightcyan"
## [406] "lightcyan1" "lightcyan2" "lightcyan3"
## [409] "lightcyan4" "lightgoldenrod" "lightgoldenrod1"
## [412] "lightgoldenrod2" "lightgoldenrod3" "lightgoldenrod4"
## [415] "lightgoldenrodyellow" "lightgray" "lightgreen"
## [418] "lightgrey" "lightpink" "lightpink1"
## [421] "lightpink2" "lightpink3" "lightpink4"
## [424] "lightsalmon" "lightsalmon1" "lightsalmon2"
## [427] "lightsalmon3" "lightsalmon4" "lightseagreen"
## [430] "lightskyblue" "lightskyblue1" "lightskyblue2"
## [433] "lightskyblue3" "lightskyblue4" "lightslateblue"
## [436] "lightslategray" "lightslategrey" "lightsteelblue"
## [439] "lightsteelblue1" "lightsteelblue2" "lightsteelblue3"
## [442] "lightsteelblue4" "lightyellow" "lightyellow1"
## [445] "lightyellow2" "lightyellow3" "lightyellow4"
## [448] "limegreen" "linen" "magenta"
## [451] "magenta1" "magenta2" "magenta3"
## [454] "magenta4" "maroon" "maroon1"
## [457] "maroon2" "maroon3" "maroon4"
## [460] "mediumaquamarine" "mediumblue" "mediumorchid"
## [463] "mediumorchid1" "mediumorchid2" "mediumorchid3"
## [466] "mediumorchid4" "mediumpurple" "mediumpurple1"
## [469] "mediumpurple2" "mediumpurple3" "mediumpurple4"
## [472] "mediumseagreen" "mediumslateblue" "mediumspringgreen"
## [475] "mediumturquoise" "mediumvioletred" "midnightblue"
## [478] "mintcream" "mistyrose" "mistyrose1"
## [481] "mistyrose2" "mistyrose3" "mistyrose4"
## [484] "moccasin" "navajowhite" "navajowhite1"
## [487] "navajowhite2" "navajowhite3" "navajowhite4"
## [490] "navy" "navyblue" "oldlace"
## [493] "olivedrab" "olivedrab1" "olivedrab2"
## [496] "olivedrab3" "olivedrab4" "orange"
## [499] "orange1" "orange2" "orange3"
## [502] "orange4" "orangered" "orangered1"
## [505] "orangered2" "orangered3" "orangered4"
## [508] "orchid" "orchid1" "orchid2"
## [511] "orchid3" "orchid4" "palegoldenrod"
## [514] "palegreen" "palegreen1" "palegreen2"
## [517] "palegreen3" "palegreen4" "paleturquoise"
## [520] "paleturquoise1" "paleturquoise2" "paleturquoise3"
## [523] "paleturquoise4" "palevioletred" "palevioletred1"
## [526] "palevioletred2" "palevioletred3" "palevioletred4"
## [529] "papayawhip" "peachpuff" "peachpuff1"
## [532] "peachpuff2" "peachpuff3" "peachpuff4"
## [535] "peru" "pink" "pink1"
## [538] "pink2" "pink3" "pink4"
## [541] "plum" "plum1" "plum2"
## [544] "plum3" "plum4" "powderblue"
## [547] "purple" "purple1" "purple2"
## [550] "purple3" "purple4" "red"
## [553] "red1" "red2" "red3"
## [556] "red4" "rosybrown" "rosybrown1"
## [559] "rosybrown2" "rosybrown3" "rosybrown4"
## [562] "royalblue" "royalblue1" "royalblue2"
## [565] "royalblue3" "royalblue4" "saddlebrown"
## [568] "salmon" "salmon1" "salmon2"
## [571] "salmon3" "salmon4" "sandybrown"
## [574] "seagreen" "seagreen1" "seagreen2"
## [577] "seagreen3" "seagreen4" "seashell"
## [580] "seashell1" "seashell2" "seashell3"
## [583] "seashell4" "sienna" "sienna1"
## [586] "sienna2" "sienna3" "sienna4"
## [589] "skyblue" "skyblue1" "skyblue2"
## [592] "skyblue3" "skyblue4" "slateblue"
## [595] "slateblue1" "slateblue2" "slateblue3"
## [598] "slateblue4" "slategray" "slategray1"
## [601] "slategray2" "slategray3" "slategray4"
## [604] "slategrey" "snow" "snow1"
## [607] "snow2" "snow3" "snow4"
## [610] "springgreen" "springgreen1" "springgreen2"
## [613] "springgreen3" "springgreen4" "steelblue"
## [616] "steelblue1" "steelblue2" "steelblue3"
## [619] "steelblue4" "tan" "tan1"
## [622] "tan2" "tan3" "tan4"
## [625] "thistle" "thistle1" "thistle2"
## [628] "thistle3" "thistle4" "tomato"
## [631] "tomato1" "tomato2" "tomato3"
## [634] "tomato4" "turquoise" "turquoise1"
## [637] "turquoise2" "turquoise3" "turquoise4"
## [640] "violet" "violetred" "violetred1"
## [643] "violetred2" "violetred3" "violetred4"
## [646] "wheat" "wheat1" "wheat2"
## [649] "wheat3" "wheat4" "whitesmoke"
## [652] "yellow" "yellow1" "yellow2"
## [655] "yellow3" "yellow4" "yellowgreen"
crtaj <- function(v1, v2){
plot(v1, v2, col = "turquoise")
plot(v2, v1, col = "turquoise")
}Да бисмо испобали рад ове функције, правимо два вектора од 100 елемената који представљају случајне бројеве из \(\{1,2,\dots 1000\}\).
x <- sample(1:1000, 100)
y <- sample(1:1000, 100)
crtaj(x, y)FOR, WHILE, REPEAT и IF наредбе:
Било која целина или блок наредби може се издвојити заградама \(\{ \}\). Ако у конзоли пређемо у нови ред, а траје блок, појавиће се + да то означи.
IF наредба
if(logicki_izraz) наредбе које се извршавају или
if(logicki_izraz) наредбе else наредбе
a## [1] 9
if(a > 3) a <- a-3 else a <- 0
a## [1] 6
a <- 2
b <- 3
c <- 4
if(a < b && b < c)
y <- a*b*c else
y <- 0Наредбе могу да буду и сложене, само би се онда ограничиле са \(\{\}\).
FOR петља
for(brojac in start:finish) {naredbe}
for (i in 1:10) print(i)## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
Пример: цртање графика помоћу for петље
# x je niz brojeva 0,0.05,0.1, ..., 1
x <- seq(0, 1, 0.05)
# Prvo crtamo grafik y=x
plot(x, x, type = "l")
# Sada hocemo da nacrtamo preko njega i x^2, x^3,.., x^8:
for(i in 2:8)
{
lines(x, x^i)
}Хоћемо да направимо матрицу \(5\times 4\), где је \(a_{i,j}=i+j\),
a <- matrix(nrow = 5, ncol = 4) # Prazna matrica
a## [,1] [,2] [,3] [,4]
## [1,] NA NA NA NA
## [2,] NA NA NA NA
## [3,] NA NA NA NA
## [4,] NA NA NA NA
## [5,] NA NA NA NA
# for petlje jedna u drugoj
for(i in 1:5)
for(j in 1:4)
a[i,j] <- i+j
a## [,1] [,2] [,3] [,4]
## [1,] 2 3 4 5
## [2,] 3 4 5 6
## [3,] 4 5 6 7
## [4,] 5 6 7 8
## [5,] 6 7 8 9
WHILE петља
while (uslov) {naredbe}
x <- 1
while(x <= 5){
x <- x+1
}
x## [1] 6
REPEAT наредба
Садржи наредбе које се извршавају, као и услов за излазак из петље, иначе имамо бесконачну петљу!
repeat{naredbe if (uslov) break}
y <- 0
repeat{
y <- y+1
if(y >= 5) break
}
y## [1] 5
- ЗАДАТАК: Написати функцију која из базе
sleepбрише елементе код којих је параметарextraмањи од задатог броја.
data(sleep)
sleep## extra group ID
## 1 0.7 1 1
## 2 -1.6 1 2
## 3 -0.2 1 3
## 4 -1.2 1 4
## 5 -0.1 1 5
## 6 3.4 1 6
## 7 3.7 1 7
## 8 0.8 1 8
## 9 0.0 1 9
## 10 2.0 1 10
## 11 1.9 2 1
## 12 0.8 2 2
## 13 1.1 2 3
## 14 0.1 2 4
## 15 -0.1 2 5
## 16 4.4 2 6
## 17 5.5 2 7
## 18 1.6 2 8
## 19 4.6 2 9
## 20 3.4 2 10
brisi <- function(x){
return (sleep[sleep$extra >= x,])
}Ако хоћемо да нам функција врати више ствари, на пример, хоћемо као претходно, али и да враћа број обрисаних елемената. Потребно је да функција врати две ставке различитог типа, па морамо направити листу.
brisi1 <- function(x){
return (list(sleep[sleep$extra >= x, ], nrow(sleep[sleep$extra < x, ])))
}*apply функције
Фамилија функција *apply са функцијама
apply, sapply и lapply чини
основу функционалног програмирања у R-у. У пиитању су
функције које служе за пресликавање елемената (вектора/матрица/листи) у
нове елементе применом једне исте функције на сваки елемент.
Додатна литература:
Функција sapply
Позив функције: sapply(v, f), где је v
вектор, матрица или листа, а f функција коју треба
применити на сваки елемент од v.
Дакле, sapply примењује дату функцију на сваки елемент
датог вектра/матрице/листе и враћа резултујући вектор. Напоменимо да
увек покушава да врати вектор, а уколико то није могуће враћа листу.
- Квадрирање сваког члана вектора
x <- 1:5
sapply(x, function(num) num^2)## [1] 1 4 9 16 25
Овај код је еквивалентан са x^2.
Аргумент функције не мора бити вектор, може бити и листа, али као излазну вредност опет добијамо вектор.
- За листу матрица желимо да одредимо суму свих вредности у матрици.
matrix_list <- list(diag(5), diag(7), matrix(1:10, nrow = 2))
# na svaku matricu iz matrix_list primenimo funkciju sum
matrix_sums <- sapply(matrix_list, sum)
matrix_sums## [1] 5 7 55
Ово је исто што и
c(sum(diag(5)), sum(diag(7)), sum(matrix(1:10, nrow=2)))## [1] 5 7 55
Уколико се примењује вишедимензиона функција, функција
sapply може да врати и матрицу.
sapply(1:5, function(k) c(k, k^2))## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 1 4 9 16 25
Свака колона је један резултат примењене функције. Прва врста је \(k\), а друга је \(k^2\).
Функција lapply
Користи се на исти начин као и функција sapply, само што
као резултат враћа листу, а не вектор. Дакле, када не очекујемо да
резултат буде увек истог типа и димензије, већ желимо да излаз буде
листа, користимо функцију lapply.
- За неки вектор направимо листу дијагоналних матрица одговарајуће димензије.
dimensions <- c(1, 3, 5)
lapply(dimensions, function(d) diag(d))## [[1]]
## [,1]
## [1,] 1
##
## [[2]]
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
##
## [[3]]
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 0 0 0 0
## [2,] 0 1 0 0 0
## [3,] 0 0 1 0 0
## [4,] 0 0 0 1 0
## [5,] 0 0 0 0 1
Исти резултат преко for петље:
result <- list()
i <- 1
for (d in dimensions) {
result[[i]] <- diag(d)
i <- i + 1
}
result## [[1]]
## [,1]
## [1,] 1
##
## [[2]]
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
##
## [[3]]
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 0 0 0 0
## [2,] 0 1 0 0 0
## [3,] 0 0 1 0 0
## [4,] 0 0 0 1 0
## [5,] 0 0 0 0 1
Функција apply
Функција apply се користи када имамо вишедимензиони улаз
(нпр. матрица или база податакa), а желимо да применимо неку функцију по
колонама или по врстама.
Функција се позива са apply(mat, dim, f), где је
mat матрица или база података, dim је
димензија по којој примењујемо функцију (1 је за врста, а 2 за колоне),
a f je функција коју примењујемо на сваку врсту или
колону.
- Збир елемената у свакој колони неке матрице.
mat <- matrix(1:12, ncol = 4)
mat## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
apply(mat, 2, sum)## [1] 6 15 24 33
Ово је еквивалентно са
colSums(mat)## [1] 6 15 24 33
- Ако желимо просек по колонама
apply(mat, 1, mean)## [1] 5.5 6.5 7.5
Што је еквивалентно са
rowMeans(mat)## [1] 5.5 6.5 7.5
Резултат не мора бити вектор, можемо вратити резултат позива функције
summary на сваку колону базе и добијамо матрицу.
head(cars) #ugradjen skup podataka u R## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
apply(cars, 2, summary)## speed dist
## Min. 4.0 2.00
## 1st Qu. 12.0 26.00
## Median 15.0 36.00
## Mean 15.4 42.98
## 3rd Qu. 19.0 56.00
## Max. 25.0 120.00
- Стандардизација колона базе података
Извршимо стандардизацију колоне базе података применом функције
apply. Применићемо следећу трансформацију \(\frac{X-m}{\sigma}\) да бисмо добили
случајну величину са очекивањем 0 и дисперзијом 1.
scaled_cars <- apply(cars, 2, function(x){
(x - mean(x)) / sd(x)
})
scaled_cars## speed dist
## [1,] -2.15596948 -1.59025960
## [2,] -2.15596948 -1.27981361
## [3,] -1.58860909 -1.51264810
## [4,] -1.58860909 -0.81414462
## [5,] -1.39948896 -1.04697911
## [6,] -1.21036883 -1.27981361
## [7,] -1.02124870 -0.96936762
## [8,] -1.02124870 -0.65892162
## [9,] -1.02124870 -0.34847563
## [10,] -0.83212857 -1.00817336
## [11,] -0.83212857 -0.58131012
## [12,] -0.64300844 -1.12459061
## [13,] -0.64300844 -0.89175612
## [14,] -0.64300844 -0.73653312
## [15,] -0.64300844 -0.58131012
## [16,] -0.45388831 -0.65892162
## [17,] -0.45388831 -0.34847563
## [18,] -0.45388831 -0.34847563
## [19,] -0.45388831 0.11719336
## [20,] -0.26476818 -0.65892162
## [21,] -0.26476818 -0.27086413
## [22,] -0.26476818 0.66047385
## [23,] -0.26476818 1.43658884
## [24,] -0.07564805 -0.89175612
## [25,] -0.07564805 -0.65892162
## [26,] -0.07564805 0.42763936
## [27,] 0.11347208 -0.42608713
## [28,] 0.11347208 -0.11564113
## [29,] 0.30259221 -0.42608713
## [30,] 0.30259221 -0.11564113
## [31,] 0.30259221 0.27241636
## [32,] 0.49171234 -0.03802963
## [33,] 0.49171234 0.50525085
## [34,] 0.49171234 1.28136584
## [35,] 0.49171234 1.59181183
## [36,] 0.68083247 -0.27086413
## [37,] 0.68083247 0.11719336
## [38,] 0.68083247 0.97091984
## [39,] 0.86995260 -0.42608713
## [40,] 0.86995260 0.19480486
## [41,] 0.86995260 0.35002786
## [42,] 0.86995260 0.50525085
## [43,] 0.86995260 0.81569685
## [44,] 1.24819285 0.89330835
## [45,] 1.43731298 0.42763936
## [46,] 1.62643311 1.04853134
## [47,] 1.62643311 1.90225783
## [48,] 1.62643311 1.94106357
## [49,] 1.62643311 2.98881880
## [50,] 1.81555324 1.63061758
Израчунајмо просек и дисперзију оригиналних и скалираних података.
round(apply(cars, 2, function(x) c(mean(x), var(x))), 2)## speed dist
## [1,] 15.40 42.98
## [2,] 27.96 664.06
round(apply(scaled_cars, 2, function(x) c(mean(x), var(x))), 2)## speed dist
## [1,] 0 0
## [2,] 1 1
Дакле, очекивано, скалирани подаци су такви да су просек и дисперзија сваке колоне редом 0 и 1.