Tipos de Objetos no R

Cristiano de Carvalho Santos

DEST-UFMG

Tipos de objetos

Os tipos básicos de objetos do R são:

Funções


Exemplos:

sqrt(5)
## [1] 2.236068
log(1)
## [1] 0
lm # Vendo o codigo da funcao
## 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>
max
## function (..., na.rm = FALSE)  .Primitive("max")

Vetores

\(~\)

Algumas funções relacionadas

\(~\) \(~\)

Exemplos:

Criando vetores:

# Criando um vetor numerico
c(5, 3, 4) # Desta forma o vetor eh apenas impresso na tela
## [1] 5 3 4
a = c(5, 3, 4)  # atribuindo ao objeto a
a 
## [1] 5 3 4
# outra forma de atribuir ao objeto, sem usar o "="
b <- c(5, 3, 4, 3, 6, 54, 5) 
b
## [1]  5  3  4  3  6 54  5
# Tamanho e tipo do vetor
length(a);   is.numeric(a); is.vector(a)
## [1] 3
## [1] TRUE
## [1] TRUE

\(~\) \(~\) \(~\)

Acessando posições dos vetores:

# Para acessar uma posicao do vetor usamos colchetes
b[5]
## [1] 6
b[ c(3, 6) ]
## [1]  4 54
# excluir alguma entrada do vetor
b[-2]
## [1]  5  4  3  6 54  5
# Podemos juntar dois vetores
d = c(a, b)

\(~\) \(~\) \(~\)

Criando vetores com sequências númericas:

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
3:10
## [1]  3  4  5  6  7  8  9 10
a = seq(0, 1, by = 0.1)
a 
##  [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
seq(1, 50, length.out = 11)
##  [1]  1.0  5.9 10.8 15.7 20.6 25.5 30.4 35.3 40.2 45.1 50.0
rep(5,10)
##  [1] 5 5 5 5 5 5 5 5 5 5
## Podemos combinar essas funcoes
# veja o help da funcao rep com ?rep
rep(1:3, each = 3)
## [1] 1 1 1 2 2 2 3 3 3
rep(1:3, times = 3)
## [1] 1 2 3 1 2 3 1 2 3

\(~\) \(~\) \(~\)

Trabalhando com caracteres:

# criando um vetor de caracteres
d = c("x1","x2","x3")
d 
## [1] "x1" "x2" "x3"
# outro exemplo
nome<-c("Maria","Pedro","Joao","Rosa")

# mais um exemplo
let5 <- letters[1:5] 
let5
## [1] "a" "b" "c" "d" "e"
let10 <- LETTERS[11:20] 
let10
##  [1] "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T"
# outro
paste("T", 1:10, sep="")
##  [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:

# criando um vetor logico
e = c(TRUE, FALSE, TRUE)
e
## [1]  TRUE FALSE  TRUE
idade <- c (23 , 21.8 , 26.1 , 27)
idade <= 25 ## vetor logico criado em uma comparacao
## [1]  TRUE  TRUE FALSE FALSE
peso <- c(78, 65, 58, 60)
peso[idade <= 25]
## [1] 78 65
#transformar um vetor logico em vetor com 0 e 1
logico = (idade <= 25)
logico * 1
## [1] 1 1 0 0
as.numeric(logico)
## [1] 1 1 0 0
sum(logico*1) # Uma forma de contar quantos TRUES existem no vetor
## [1] 2

\(~\) \(~\) \(~\)

Nomeando as posições:

# colocando nomes nas posicoes de um vetor
a = 1:3 
names(a)= c("x1","x2","x3") 
a
## x1 x2 x3 
##  1  2  3
# de outra forma
x = c(a = 1, b = 5) 
x
## a b 
## 1 5
# criando um vetor com dados faltantes
b = c(1, 3, 3, 5, 6, NA, 8, 9,4)

\(~\) \(~\) \(~\)

Operações com vetores e outras funções úteis:

idade <- c (23 , 21.8 , 26.1 , 27)
idade * 10
## [1] 230 218 261 270
idade - 10
## [1] 13.0 11.8 16.1 17.0
distidade<-idade - mean(idade)
distidade
## [1] -1.475 -2.675  1.625  2.525
# Outras duas funcoes uteis

sort(idade) # ordena os valores em ordem crescente
## [1] 21.8 23.0 26.1 27.0
rank(idade) # atribui posicões aos elementos
## [1] 2 1 3 4
which(idade > 23)
## [1] 3 4
which.max(c(1, 2, 5, 3, 3)) ## Posicao onde esta maximo
## [1] 3
max(c(1, 2, 5, 3, 3)) ## calcula o maximo
## [1] 5

Matriz

\(~\)

Algumas funções relacionadas

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
length(M1)
## [1] 6
# criando uma matriz diagonal
diag(3) # matriz identidade
##      [,1] [,2] [,3]
## [1,]    1    0    0
## [2,]    0    1    0
## [3,]    0    0    1
diag(5,3)
##      [,1] [,2] [,3]
## [1,]    5    0    0
## [2,]    0    5    0
## [3,]    0    0    5
# criando uma matriz apartir de vetores
cbind(1:4,9:12)
##      [,1] [,2]
## [1,]    1    9
## [2,]    2   10
## [3,]    3   11
## [4,]    4   12
rbind(1:4,9:12)
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    9   10   11   12
# transformando um vetor em matriz coluna
as.matrix(1:5)
##      [,1]
## [1,]    1
## [2,]    2
## [3,]    3
## [4,]    4
## [5,]    5
# operacoes matriciais
M1 = diag(2,3)
M2 = cbind(1:3,4:6,7:9)
V1 = 1:3
V2 = as.matrix(V1)

M1 + M2
##      [,1] [,2] [,3]
## [1,]    3    4    7
## [2,]    2    7    8
## [3,]    3    6   11
M1 * M2
##      [,1] [,2] [,3]
## [1,]    2    0    0
## [2,]    0   10    0
## [3,]    0    0   18
M1 %*% M2
##      [,1] [,2] [,3]
## [1,]    2    8   14
## [2,]    4   10   16
## [3,]    6   12   18
solve(M1)
##      [,1] [,2] [,3]
## [1,]  0.5  0.0  0.0
## [2,]  0.0  0.5  0.0
## [3,]  0.0  0.0  0.5
#solve(M2)
t(M2)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
M2 %*% V1
##      [,1]
## [1,]   30
## [2,]   36
## [3,]   42
M2 %*% V2
##      [,1]
## [1,]   30
## [2,]   36
## [3,]   42
M2 + V1
##      [,1] [,2] [,3]
## [1,]    2    5    8
## [2,]    4    7   10
## [3,]    6    9   12
M2 + V1
##      [,1] [,2] [,3]
## [1,]    2    5    8
## [2,]    4    7   10
## [3,]    6    9   12
M1>M2
##       [,1]  [,2]  [,3]
## [1,]  TRUE FALSE FALSE
## [2,] FALSE FALSE FALSE
## [3,] FALSE FALSE FALSE
M2>V1
##       [,1] [,2] [,3]
## [1,] FALSE TRUE TRUE
## [2,] FALSE TRUE TRUE
## [3,] FALSE TRUE TRUE
# Atribuindo nomes
colnames(M2) = c("a","b","c")
rownames(M2) = c("d","e","f")

sum(M2)
## [1] 45
colSums(M2)
##  a  b  c 
##  6 15 24
rowSums(M2)
##  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
M[1,1]
## [1] 18
M[1,]  #retorna a primeira linha da matriz
## positivo negativo 
##       18        2

Array

\(~\) \(~\)

Exemplo:

## array
ar1 <- array(1:24, dim = c(3, 4, 2)) 
ar1
## , , 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

Data.frame

\(~\)

Algumas funções relacionadas

\(~\) \(~\)

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
head(dados)
##   idade salario estadocivil
## 1    24    2000    solteiro
## 2    30    3000      casado
## 3    54    1700      casado
## 4    31     500    solteiro
## 5    19     550      casado
names(dados)
## [1] "idade"       "salario"     "estadocivil"
dados[1,] # mostra os dados da primeira linha
##   idade salario estadocivil
## 1    24    2000    solteiro
dados[,1] # mostra os dados da primeira coluna
## [1] 24 30 54 31 19
dados$idade
## [1] 24 30 54 31 19
dados$salario
## [1] 2000 3000 1700  500  550
dados$estadocivil
## [1] solteiro casado   casado   solteiro casado  
## Levels: casado solteiro
mean(dados$idade)
## [1] 31.6
mean(dados$salario)
## [1] 1550
by(dados$salario, dados$estadocivil, mean)
## dados$estadocivil: casado
## [1] 1750
## ------------------------------------------------------------ 
## dados$estadocivil: solteiro
## [1] 1250
## um dataframe pode ser editado usando as funcoes fix e edit
#edit(dados)
#fix(dados)

Lista

\(~\)

Exemplos:

### Lista
lis1 <- list(A = 1:10, B = "THIS IS A MESSAGE", C = matrix(1:9, ncol = 3))
lis1
## $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
lis1[1]
## $A
##  [1]  1  2  3  4  5  6  7  8  9 10
mode(lis1[1])
## [1] "list"
lis1[[1]]
##  [1]  1  2  3  4  5  6  7  8  9 10
mode(lis1[[1]])
## [1] "numeric"

Como criar uma função

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

    fc = function(a, b)
    {
            c = a^b+b
            return(c)   
    }

Saiba que:

\(~\) \(~\)

Exemplos:

### Criar uma funcao
fc = function(a, b){
  c = a^b+b
  return(c) 
}

fc(1,2)
## [1] 3
fc(2,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"
a3 = fc2(2,3)
## [1] "a: 2"
## [1] "b: 3"
a3
## [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
c1
## [1] 6