Cristiano de Carvalho Santos
DEST-UFMG
Os tipos básicos de objetos do R são:
vetores
matrizes e array
data-frames
listas
funções
Função é um tipo objeto especial que recebe algum ‘input’ e produz um ‘output’
O conteúdo das funções podem ser vistos digitando o nome da função (sem os parênteses)
Entretanto isto não é disponível desta forma para todas as funções como por exemplo em min, max, rnorm e lines
Podemos criar novas funções
Exemplos:
## [1] 2.236068
## [1] 0
## function (formula, data, subset, weights, na.action, method = "qr",
## model = TRUE, x = FALSE, y = FALSE, qr = TRUE, singular.ok = TRUE,
## contrasts = NULL, offset, ...)
## {
## ret.x <- x
## ret.y <- y
## cl <- match.call()
## mf <- match.call(expand.dots = FALSE)
## m <- match(c("formula", "data", "subset", "weights", "na.action",
## "offset"), names(mf), 0L)
## mf <- mf[c(1L, m)]
## mf$drop.unused.levels <- TRUE
## mf[[1L]] <- quote(stats::model.frame)
## mf <- eval(mf, parent.frame())
## if (method == "model.frame")
## return(mf)
## else if (method != "qr")
## warning(gettextf("method = '%s' is not supported. Using 'qr'",
## method), domain = NA)
## mt <- attr(mf, "terms")
## y <- model.response(mf, "numeric")
## w <- as.vector(model.weights(mf))
## if (!is.null(w) && !is.numeric(w))
## stop("'weights' must be a numeric vector")
## offset <- model.offset(mf)
## mlm <- is.matrix(y)
## ny <- if (mlm)
## nrow(y)
## else length(y)
## if (!is.null(offset)) {
## if (!mlm)
## offset <- as.vector(offset)
## if (NROW(offset) != ny)
## stop(gettextf("number of offsets is %d, should equal %d (number of observations)",
## NROW(offset), ny), domain = NA)
## }
## if (is.empty.model(mt)) {
## x <- NULL
## z <- list(coefficients = if (mlm) matrix(NA_real_, 0,
## ncol(y)) else numeric(), residuals = y, fitted.values = 0 *
## y, weights = w, rank = 0L, df.residual = if (!is.null(w)) sum(w !=
## 0) else ny)
## if (!is.null(offset)) {
## z$fitted.values <- offset
## z$residuals <- y - offset
## }
## }
## else {
## x <- model.matrix(mt, mf, contrasts)
## z <- if (is.null(w))
## lm.fit(x, y, offset = offset, singular.ok = singular.ok,
## ...)
## else lm.wfit(x, y, w, offset = offset, singular.ok = singular.ok,
## ...)
## }
## class(z) <- c(if (mlm) "mlm", "lm")
## z$na.action <- attr(mf, "na.action")
## z$offset <- offset
## z$contrasts <- attr(x, "contrasts")
## z$xlevels <- .getXlevels(mt, mf)
## z$call <- cl
## z$terms <- mt
## if (model)
## z$model <- mf
## if (ret.x)
## z$x <- x
## if (ret.y)
## z$y <- y
## if (!qr)
## z$qr <- NULL
## z
## }
## <bytecode: 0x0000000013b6cb60>
## <environment: namespace:stats>
## function (..., na.rm = FALSE) .Primitive("max")
Vetores são o tipo básico e mais simples de objeto para armazenar dados no R.
Podem ser formados por números, nomes, elementos lógicos, desde que todos os elementos sejam do mesmo tipo
O R é uma linguagem vetorial, e portanto capaz de operar vetores e matrizes diretamente sem a necessidade de “loops”.
\(~\)
\(c(\ )\) (‘’c’’ de concaternar), \(scan(\ )\)
\(rep(\ )\), \(seq(\ )\) e ’‘:’’ são usados para sequências de elementos
Os colchetes \([\ ]\) são usados para indicar seleção de elementos
\(is.vector(\ )\), \(is.numeric(\ )\), \(is.character(\ )\), \(length(\ )\), \(mode(\ )\)
\(as.vector(\ )\), names, etc
\(~\) \(~\)
Exemplos:
Criando vetores:
## [1] 5 3 4
## [1] 5 3 4
## [1] 5 3 4 3 6 54 5
## [1] 3
## [1] TRUE
## [1] TRUE
\(~\) \(~\) \(~\)
Acessando posições dos vetores:
## [1] 6
## [1] 4 54
## [1] 5 4 3 6 54 5
\(~\) \(~\) \(~\)
Criando vetores com sequências númericas:
## [1] 1 2 3 4 5 6 7 8 9 10
## [1] 3 4 5 6 7 8 9 10
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
## [1] 1.0 5.9 10.8 15.7 20.6 25.5 30.4 35.3 40.2 45.1 50.0
## [1] 5 5 5 5 5 5 5 5 5 5
## [1] 1 1 1 2 2 2 3 3 3
## [1] 1 2 3 1 2 3 1 2 3
\(~\) \(~\) \(~\)
Trabalhando com caracteres:
## [1] "x1" "x2" "x3"
## [1] "a" "b" "c" "d" "e"
## [1] "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T"
## [1] "T1" "T2" "T3" "T4" "T5" "T6" "T7" "T8" "T9" "T10"
# Fator - Usado com variaveis categoricas
frutas<-rep(c("laranja","banana","limao","jaboticaba"),times=5)
frutas <-factor(frutas)
frutas
## [1] laranja banana limao jaboticaba laranja banana
## [7] limao jaboticaba laranja banana limao jaboticaba
## [13] laranja banana limao jaboticaba laranja banana
## [19] limao jaboticaba
## Levels: banana jaboticaba laranja limao
citricas<-frutas # copia o objeto frutas para o objeto citricas
levels(citricas) # mostra os objetos de citricas
## [1] "banana" "jaboticaba" "laranja" "limao"
levels(citricas)<-c("nao", "nao", "sim", "sim") #modifica os niveis dos fatores
citricas # mostra o fator modificado
## [1] sim nao sim nao sim nao sim nao sim nao sim nao sim nao sim nao sim nao sim
## [20] nao
## Levels: nao sim
\(~\) \(~\) \(~\)
Trabalhando com vetores lógicos:
## [1] TRUE FALSE TRUE
## [1] TRUE TRUE FALSE FALSE
## [1] 78 65
## [1] 1 1 0 0
## [1] 1 1 0 0
## [1] 2
\(~\) \(~\) \(~\)
Nomeando as posições:
## x1 x2 x3
## 1 2 3
## a b
## 1 5
\(~\) \(~\) \(~\)
Operações com vetores e outras funções úteis:
## [1] 230 218 261 270
## [1] 13.0 11.8 16.1 17.0
## [1] -1.475 -2.675 1.625 2.525
## [1] 21.8 23.0 26.1 27.0
## [1] 2 1 3 4
## [1] 3 4
## [1] 3
## [1] 5
Uma matriz é uma coleção de vetores de mesmo comprimento organizados um do lado do outro.
Todos os elementos de um vetor e também de uma matriz devem ser do mesmo tipo, isto é, devem ser todos numéricos ou devem ser todos caracteres.
\(~\)
matrix, cbind, rbind, diag
dim, length
colnames, rownames, dimnames
sum, rowSums, colSums
Os sinais \(*\) e \(/\) fazem operações ponto a ponto, e para isso as matrizes envolvidas devem ter a mesma dimensão
Para multiplicação matricial você deve usar \(\% * \%\)
As funções \(t(A)\) e \(solve(A)\) retornam as matrizes transposta e inversa de uma matriz \(A\) definida anteriormente
Exemplos:
freq<-c(18, 02, 04, 26)
M <-matrix(freq, ncol=2)
M <-matrix(c(18, 02, 04, 26), ncol=2)
M <-matrix(c(18, 02, 04, 26), ncol=2, byrow=TRUE)
# criando uma matriz com zeros
M1 <-matrix(0,ncol=3,nrow = 2)
dim(M1)
## [1] 2 3
## [1] 6
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
## [,1] [,2] [,3]
## [1,] 5 0 0
## [2,] 0 5 0
## [3,] 0 0 5
## [,1] [,2]
## [1,] 1 9
## [2,] 2 10
## [3,] 3 11
## [4,] 4 12
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 9 10 11 12
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
## [4,] 4
## [5,] 5
## [,1] [,2] [,3]
## [1,] 3 4 7
## [2,] 2 7 8
## [3,] 3 6 11
## [,1] [,2] [,3]
## [1,] 2 0 0
## [2,] 0 10 0
## [3,] 0 0 18
## [,1] [,2] [,3]
## [1,] 2 8 14
## [2,] 4 10 16
## [3,] 6 12 18
## [,1] [,2] [,3]
## [1,] 0.5 0.0 0.0
## [2,] 0.0 0.5 0.0
## [3,] 0.0 0.0 0.5
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
## [,1]
## [1,] 30
## [2,] 36
## [3,] 42
## [,1]
## [1,] 30
## [2,] 36
## [3,] 42
## [,1] [,2] [,3]
## [1,] 2 5 8
## [2,] 4 7 10
## [3,] 6 9 12
## [,1] [,2] [,3]
## [1,] 2 5 8
## [2,] 4 7 10
## [3,] 6 9 12
## [,1] [,2] [,3]
## [1,] TRUE FALSE FALSE
## [2,] FALSE FALSE FALSE
## [3,] FALSE FALSE FALSE
## [,1] [,2] [,3]
## [1,] FALSE TRUE TRUE
## [2,] FALSE TRUE TRUE
## [3,] FALSE TRUE TRUE
## [1] 45
## a b c
## 6 15 24
## d e f
## 12 15 18
# Usando matriz para fazer uma tabela
freq<-c(18, 02, 04, 26)
M<-matrix(freq, ncol = 2, byrow = TRUE, dimnames = list(c("doente","nao doente"),
c("positivo","negativo")))
M
## positivo negativo
## doente 18 2
## nao doente 4 26
## [1] 18
## positivo negativo
## 18 2
O conceito de array generaliza a ideia de matriz
Enquanto em uma matriz os elementos são organizados em duas dimensões (linhas e colunas), em um array os elementos podem ser organizados em um número arbitrário de dimensões
No R um array é definido utilizando a função array()
\(~\) \(~\)
Exemplo:
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] 13 16 19 22
## [2,] 14 17 20 23
## [3,] 15 18 21 24
O ‘’data-frame’’ é uma estrutura semelhante à uma matriz porém com cada coluna sendo tratada separadamente.
Podemos ter colunas de valores numéricos e colunas de caracteres no mesmo objeto.
Note entretanto que dentro de uma mesma coluna todos elementos ainda serão forçados a serem do mesmo tipo.
O \(\$\) pode ser usado para selecionar uma das colunas
\(~\)
\(~\) \(~\)
Exemplos:
### Data.frame
dados <- data.frame(idade=c(24,30,54,31,19),salario=c(2000,3000,1700,500,550),
estadocivil= c("solteiro","casado","casado","solteiro","casado"))
dados
## idade salario estadocivil
## 1 24 2000 solteiro
## 2 30 3000 casado
## 3 54 1700 casado
## 4 31 500 solteiro
## 5 19 550 casado
## idade salario estadocivil
## 1 24 2000 solteiro
## 2 30 3000 casado
## 3 54 1700 casado
## 4 31 500 solteiro
## 5 19 550 casado
## [1] "idade" "salario" "estadocivil"
## idade salario estadocivil
## 1 24 2000 solteiro
## [1] 24 30 54 31 19
## [1] 24 30 54 31 19
## [1] 2000 3000 1700 500 550
## [1] solteiro casado casado solteiro casado
## Levels: casado solteiro
## [1] 31.6
## [1] 1550
## dados$estadocivil: casado
## [1] 1750
## ------------------------------------------------------------
## dados$estadocivil: solteiro
## [1] 1250
Listas são estruturas genéricas e flexíveis que permitem armazenar diversos formatos em um único objeto.
Uma lista é portanto uma coleção de objetos.
\(~\)
Exemplos:
## $A
## [1] 1 2 3 4 5 6 7 8 9 10
##
## $B
## [1] "THIS IS A MESSAGE"
##
## $C
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
## $A
## [1] 1 2 3 4 5 6 7 8 9 10
## [1] "list"
## [1] 1 2 3 4 5 6 7 8 9 10
## [1] "numeric"
Nome = function(argumentos)
{
processamento de alguma conta
return(resultado)
}
Exemplo: podemos criar a função \(fc\) que calcule \(a^b+b\) para valores \(a\) e \(b\) passados como argumentos da função
Saiba que:
Apenas um objeto pode ser retornado em cada função
Se desejarmos retornar mais de um objeto podemos criar uma lista
Se não usarmos a função \(return\), a função construída retornará o último resultado calculado dentro da função, mas nem sempre funciona
Podemos usar as funções \(print\) ou \(cat\) para imprimir na tela o resultado de alguma conta realizada ou frase dentro da função
\(~\) \(~\)
Exemplos:
## [1] 3
## [1] 11
# Outra funcao - Note que nao coloquei o return
fc2 = function(a, b){
print(paste("a:", a))
print(paste("b:", b))
c1 = a^b+b
d1 = a+b
}
fc2(1,2)
## [1] "a: 1"
## [1] "b: 2"
## [1] "a: 2"
## [1] "b: 3"
## [1] 5
#c1 ## Objeto foi definido apenas dentro da funcao, por isso dara erro
# Mais uma funcao construida - usando um objeto definido globalmente
d = 2
fc3 = function(a){
c = a^d+d
return(c)
}
fc3(4)
## [1] 18
## objeto d eh definido globalmente e por isso ele existe dentro da funcao mesmo
## que nos nao o colocamos como argumento
## definindo variavel global de dentro da funcao
fc4 = function(a, b){
c1 <<- a^b+b ## com isso o c1 passa a existir fora da funcao criada
d1 = a+b
return(d1)
}
fc4(2,2)
## [1] 4
## [1] 6