# Osnovne strukture podataka u R ### Primitivni tipovi ## Logicki tip - logical (TRUE/FALSE) 1 == 1 2 == 3 # Vrednosti: TRUE i FALSE (velika slova!) 0 == FALSE # Operatori kao u drugim jezicima: # > < == <= >= && || ! xor !(FALSE || TRUE) && FALSE 5 > 2 ## Brojevi - numeric (uvek double interno) 5 + 6 3 / 2 # = 1.5 class(5) ## Celi brojevi - integer (interno int (ili long)) 5L class(5L) 5L / 3L # deljenje je uvek realno # celobrojno deljenje: 5 %/% 3 # operacije nad brojevima: # + - * / # ^ - stepenovanje 5 ^ 2 # %/% - celobrojno deljenje # %% - ostatak pri deljenju 5 %/% 3 5 %% 3 # postoje elementarne funkcije sin, cosin, asin, tan, log, exp, itd. sin(log(exp(pi))) # nije bas nula nego 1.2246 * 10^(-16) sin(log(exp(pi))) == 0 abs(sin(log(exp(pi)))) < 1e-15 ## Stringovi - character (ne postoji razlika izmedju karaktera i stringova) class("softveri") class('s') # moze se koristiti i ' i ". Izaberite sta god, ali # se drzite jedne iste notacije # spajanje: paste("a", "b") # spaja i odvoji razmakom paste0("a", "b") # spaja bez razmaka paste("Broj:", 5) paste("Ja", "matf", sep = " <3 ") paste(1, 2, 3, sep = " < ") # c stil formatiranja sprintf("Broj %d. Izvucen je broj %d", 7, 8) sprintf("Broj %.2f", pi) # instaliranje paketa: install.packages("glue") # glue je koristan paket za rad sa stringovima library(glue) glue("{who} <3 {what}", who = "ja", what = "matf") glue("{number} == {number}", number = 6) num <- 42 glue("{num} je 42") glue("{num + 1} je 43") glue("{num + 1} je 43", "- {num + 1} je 43") ### Vektor # vektori se prave funkcijom "c" (c = combine) c(1, 2, 3) 1:3 10:15 class(c(1, 2, 3)) length(5) length(1:5) seq(1, 16, by = 2) # by odredjuje korak seq(1, 10, length.out = 100) vec1 <- c(1, 2, 45, 65) vec2 <- c(3, 4, 42, 62) # funckije nad vektorima, sum, mean, median, itd. sum(vec1) median(vec1) summary(vec1) # sve operacije nad brojevima se mogu primeniti i na vektore, a primenjuju # se element po element # npr: R: vec1 * vec2 # MATLAB: vec1 .* vec2 vec1 + vec2 c(1, 2, 3, 4) ^ c(2, 2, 2, 2) c(1, 2, 3, 4) ^ 2 c(2,2,2,2) == rep(2,4) rep(2,4) sin(vec1) exp(log(vec1)) # vektori mogu sadrzati elemente istog primitivnog tipa! class(c(1, "s")) # uvek uzima najfleksibilniji tip: # logical < integer < numeric < string c(TRUE, 2L, 3) # logicki operatori su vektorizovani 1:5 <= c(1, 1, 2, 2, 3) # postoje any i all any(1:5 <= c(1, 1, 2, 2, 3)) all(1:5 <= c(1, 1, 2, 2, 3)) ###### R INFERNO 1 ### # Obratiti paznju na & i &&, kao i | i || A <- c(FALSE, TRUE, TRUE, FALSE) B <- c(TRUE, FALSE, TRUE, FALSE) # & i | rade vektorski A & B A | B A && B A || B ### Matrice matrix(1:9, nrow = 3, ncol = 3) matrix(c(1, 1, 1, 2, 2, 2, 3, 3, 3), nrow = 3) A <- matrix(c(1, 1, 1, 2, 2, 2, 3, 3, 3), nrow = 3, byrow = TRUE) # operacije nad matricama # transponovanje t(A) # matricno mnozenje %*% A %*% A # element po element A * A # npr. skalarno mnozenje u <- c(1, 2, 3) v <- c(4, 5, 6) sum(u * v) t(u) %*% v class(sum(u * v)) # numeric class(t(u) %*% v) # matrix as.numeric(t(u) %*% v) as.matrix(u) # vektori su kolone # Generisanje slucajnih brojeva runif(10, -1, 1) rnorm(10) hist(rnorm(1000)) # hist - histogram hist(rexp(1000)) hist(rt(1000, df = 3)) # vratimo se na matrice random_matrix <- matrix(rnorm(20), nrow = 5) random_matrix random_matrix[2, 2] random_matrix[1, 3] options(width = 160) # vise mesta za print random_matrix[, 2] # 2. kolona random_matrix[3, ] # 3. vrsta random_matrix[c(2, 4), ] # 2 i 4 vrsta random_matrix[, c(1,2)] random_matrix random_matrix[c(1,3), c(2, 4)] # indeksiranje vektora random_vector <- rnorm(6) random_vector random_vector > 0 random_vector[random_vector > 0] random_vector[c(TRUE, FALSE, FALSE, TRUE, TRUE, FALSE)] random_vector[2] random_vector[-2] random_vector[-c(2, 4)] #### Liste # Za razliku od vektora i matrica, lista moze da sadrzi # elemente razlicitog primitivnog tipa dummy_list <- list(c(1, 2, 3), c("a", "b"), c(TRUE, FALSE, TRUE, TRUE)) dummy_list nested_list <- list(list(c(1, 2, 3), 5:7), c("a", "b"), c(TRUE, FALSE, TRUE, TRUE)) nested_list length(nested_list[[2]]) length(nested_list[2]) nested_list[3] named_list <- list(brojevi = 1:5, slova = c("a", "b")) named_list$brojevi named_list[[1]] is_even <- function(number) { return(number %% 2 == 0) } is_even(5) is_even(4) is_even(1:5)