O R trabalha com vários tipos de objetos. Esses objetos podem ser vetores, matrizes, funções, planilhas de dados, etc. A seguir apresentamos alguns destes objetos e como eles podem ser criados.
Os vetores são um dos tipos de objetos mais importantes e mais usados no R. Eles podem armazenar números, nomes, elementos lógicos, desde que sejam da mesma classe.
Um vetor é criado no R com a função c()
(c de “concatenate”), onde entre os parênteses escrevemos os elementos do vetor separados por vírgula. Mostramos, a seguir, alguns exemplos:
Vamos guardar num vetor denominado notas as notas de 5 alunos na prova de Estatística: 19, 20, 25, 23, 29. Para isto fazemos:
notas = c(19, 20, 25, 23, 29)
notas
## [1] 19 20 25 23 29
Suponha que as notas acima correspondam aos alunos: Bruno, Luara, Caio, Maria e Rita. Um vetor com os nomes dos alunos, nomeado como nomes, e criado fazendo:
nomes = c("Bruno", "Luara", "Caio","Maria", "Rita")
nomes
## [1] "Bruno" "Luara" "Caio" "Maria" "Rita"
Ao criar um vetor de caracteres os nomes que constituem os elementos do vetor devem ser escritos entre aspas duplas.
Suponha que o aluno Pedro não realizou a prova e, portanto, a informação sobre sua nota não está disponível. No R, usamos o símbolo NA (not available) para identificar as observações faltantes. Vamos incluir o nome Pedro no vetor nomes e criar um novo vetor de notas denominado notasE, incluindo a observação NA para Pedro.
nomes = c(nomes, "Pedro")
notasE = c(notas, NA)
nomes
## [1] "Bruno" "Luara" "Caio" "Maria" "Rita" "Pedro"
notasE
## [1] 19 20 25 23 29 NA
Existem casos em que uma ordem ou sequência de observações se repete muitas vezes. Para estes casos, as funções seq()
e rep()
são muito úteis para a criação de um vetor, minimizando o tamanho do código necessário para a sua criação.
seq_a = seq(from = 1 , to = 20, by = 1)
seq_a
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
seq_b = seq(20,1)
seq_b
## [1] 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
seq_c = seq(0,50,5)
seq_c
## [1] 0 5 10 15 20 25 30 35 40 45 50
seq_d = seq(0, 40, length.out = 21)
seq_d
## [1] 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
seq_e<-rep(c(2,3,4,5,6),each=3) # each indica que cada elemento deve ser repetido 3 vezes
seq_e
## [1] 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
seq_f = rep(c(2,3,4),times=5) # times indica a quantidade de vezes que a sequência 2, 3, 4 deve ser repetida
seq_f
## [1] 2 3 4 2 3 4 2 3 4 2 3 4 2 3 4
seq_g = paste(c("aluno"),1:4,sep="_") # sep="_" indica que o nome do aluno é separado do número por um traço.
seq_g
## [1] "aluno_1" "aluno_2" "aluno_3" "aluno_4"
É possível criar vetores com padrões lógicos no R. Por exemplo, considere o vetor “notasE” com as notas de 6 alunos na prova de Estatística. Para sabermos quais alunos obtiveram nota maior ou igual a 60, avaliamos a seguinte condição lógica: notas >= 60
. O R retorna a resposta TRUE
se e condição avaliada é verdadeira e FALSE
caso contrário, a resposta NA
é impressa para os alunos para os quais não foi possível avaliar a condição de interesse.
notasE = c(56,89,90,100,47,NA)
aprovado = notasE>=60
aprovado
## [1] FALSE TRUE TRUE TRUE FALSE NA
No quadro abaixo indicamos como expressar outras condições lógicas. Observe que para expressar a condição lógica de igualdade usamos 2 sinais de igualdade.Operação lógica | Operador |
---|---|
maior que | < |
menor que | > |
igual a | == |
maior ou igual que | >= |
menor ou igual que | <= |
diferente que | != |
avalia se condição x é falsa |
!x |
avalia se condições x e y são verdadeiras |
x & y |
avalia se condições x ou y são verdadeiras |
x | y |
Frequentemente a expressão lógica a ser avaliada é composta de 2 ou mais expressões logicas aplicadas aos elementos de um ou mais vetores. Por exemplo, considere que vetor “notasC” expresse as notas de Cálculo 1, com o seguintes valores: 70, 65, 85, 90, 6, 89:
notasC = c(70,65,85,90,6,89)
Como podemos avaliar as seguintes condições lógicas?:
a) Nota menor do que 80 nas duas disciplinas.
b) Nota menor do que 80 em pelo menos uma das disciplinas.
Para isto, vamos usar os operadores lógicos “&” e “|”.
notasE<80 & notasC<80 # ambas notas menores do que 80
## [1] TRUE FALSE FALSE FALSE TRUE FALSE
notasE<80 | notasC<80 # uma ou mais notas menores do que 80
## [1] TRUE TRUE FALSE FALSE TRUE NA
A função is.na()
é uma expressão lógica que retorna TRUE se o elemento do vetor é NA e FALSE, caso contrário. Se desejarmos saber se o elemento do vetor não é um NA, utilizamos !is.na()
. Veja os exemplos:
is.na(notasE) # responde a pergunta: o elemento do vetor é um NA?
## [1] FALSE FALSE FALSE FALSE FALSE TRUE
!is.na(notasE) # responde a pergunta: o elemento do vetor é um NA?
## [1] TRUE TRUE TRUE TRUE TRUE FALSE
Cálculos matemáticos podem ser realizados com os elementos de um vetor numérico. Valem aqui as propriedades de vetores. Considere os seguintes exemplos:
notasE + 3
## [1] 59 92 93 103 50 NA
(notasE + notasC)
## [1] 126 154 175 190 53 NA
(notasE + notasC)/2
## [1] 63.0 77.0 87.5 95.0 26.5 NA
Quando algum cálculo numérico for impossível de ser realizado o R retorna a observação NaN (not a number). Por exemplo, quando calculamos o logaritmo da diferença entre as notas dos alunos nas 2 provas o simbolo NaN é retornado, para a primeira observação que apresenta valor negativo para a diferença entre as notas.
notasE-notasC
## [1] -14 24 5 10 41 NA
log(notasE-notasC)
## Warning in log(notasE - notasC): NaNs produzidos
## [1] NaN 3.178054 1.609438 2.302585 3.713572 NA
Na tabela seguinte são apresentados os símbolos utilizados pelo R para representar as operações matemáticas elementares e outros operações muito utilizadas.Operador Aritmético Elementar | Simbologia |
---|---|
Soma | + |
Subtração | - |
Divisão | / |
Multiplicação | * |
Potência | ^ |
Raiz quadrada | sqrt() |
Logaritmo | log() |
Exponencial | exp() |
Cosseno | cos() |
Sen | sen() |
Tangente | tan() |
Os elementos de um vetor são identificados por suas posições variando de 1 a n, onde n é o comprimento do vetor. Por exemplo, para o vetor “notasE” com 6 elementos as posições variam de 1 a 6. Subconjuntos ou elementos de um vetor são selecionados indicando entre colchetes a ordem dos elementos desejados. Mostramos a seguir alguns exemplos.
nomes
## [1] "Bruno" "Luara" "Caio" "Maria" "Rita" "Pedro"
notasE
## [1] 56 89 90 100 47 NA
notasE[1] # retorna a nota do aluno 1, Bruno
## [1] 56
notasE[1:3] # retorna as notas dos alunos 1,2 e 3: Bruno, Luara e Caio
## [1] 56 89 90
notasE[c(2,4,6)] # retorna as notas dos alunos 2, 4 e 6: Luara, Maria e Pedro
## [1] 89 100 NA
Podemos também usar as expressões lógicas para selecionar as notas dos alunos. Seguem alguns exemplos:
notasE[notasE > 80] # retorna notas maiores do que 80
## [1] 89 90 100 NA
notasE[!is.na(notasE)] # retorna notas sem dados faltantes
## [1] 56 89 90 100 47
notasE[nomes=="Maria"] # retorna nota de Maria
## [1] 100
notasE[nomes == "Maria" | nomes == "Rita"] # retorna notas de notas dos alunos MAria e Rita
## [1] 100 47
nomes[notasE>80 & !is.na(notasE)] #retorna notas maiores do que 80 e diferentes de NA
## [1] "Luara" "Caio" "Maria"
Agora que sabemos como acessar os elementos é fácil modificar um elemento do vetor. Suponha que o aluno Pedro fez a segunda chamada da prova e obteve nota 80. Podemos substituir a observação NA atribuída a nota de Pedro pela nota 80 fazendo:
notasE[6]=80
notasE
## [1] 56 89 90 100 47 80
ou de forma equivalente fazendo notasE[nomes=="Pedro"] = 80
.
Apresentamos a seguir algumas funções úteis que permitem avaliar propriedades dos vetores:
length()
:length(nomes)
## [1] 6
str(structure)
:str(nomes)
## chr [1:6] "Bruno" "Luara" "Caio" "Maria" "Rita" "Pedro"
str(notasE)
## num [1:6] 56 89 90 100 47 80
str(aprovado)
## logi [1:6] FALSE TRUE TRUE TRUE FALSE NA
is.vector()
:is.vector(notasE)
## [1] TRUE
min(notasE)
## [1] 47
max(notasE)
## [1] 100
sum(notasE)
## [1] 462
prod(notasE)
## [1] 168658560000
sort()
. Para ordenação crescente fazemos o argumento decreasing igual a TRUE. Quando não especcificamos esse argumento ou o fazemos igual a FALSe a ordenação crescente é considerada.sort(notasE,decreasing = FALSE) # ordem crescente dos valores
## [1] 47 56 80 89 90 100
sort(notasE, decreasing = TRUE) #ordem decrescente dos valores
## [1] 100 90 89 80 56 47
Quando o vetor contiver nomes (quantidades não numéricas), a ordenação é realizada segundo a ordem alfabética dos seus elementos.
rank(notasE)
## [1] 2 4 5 6 1 3
Por exemplo, o aluno Bruno, que ocupa a primeira posição no vetor notasE, ocupa a segunda posição quando as notas são dipostas numa sequência ordenada crescente.
Fatores são os objetos do R adequados para representar variáveis categóricas. Por exemplo, considere as variáveis sexo (masculino ou feminino) e classe de renda (C < B < A). A variável sexo é uma variável categórica nominal e a variável renda categórica ordinal.
Quando uma variável é declarada como fator no R, seus valores são armazenados na memória do R como números inteiros e cada número possui um nome (label) associado. Por exemplo, a informação sobre sexo (masculino, feminino) é armazenada como (1,2).
Fatores possuem um número finito de categorias chamados de níveis que, a menos que se especifique de outra forma, são ordenados segundo a ordem alfabética. Por exemplo, o valor 1 é associado a categoria feminino e o valor 2 a categoria masculino. Embora o R armazene as categorias como valores inteiros, ele retorna seus “labels” quando visualizamos o fator.
Para criar um fator no R usamos a função factor. A seguir criamos o fator esporte a partir da informação do tipo de esporte praticado por 8 pessoas.
esportes = factor(c("basquete","hipismo","handebol","futebol","tenis","judô","basquete", "futebol"))
esportes
## [1] basquete hipismo handebol futebol tenis judô basquete futebol
## Levels: basquete futebol handebol hipismo judô tenis
Para visualizar os níveis do fator esportes, usamos a função levels como segue:
levels(esportes)
## [1] "basquete" "futebol" "handebol" "hipismo" "judô" "tenis"
Suponha que as 8 pessoas acima foram classificadas como atletas de baixo, médio ou alto desempenho, e seus resultados foram armazenados no vetor de caracteres que denominamos de desempenho:
desempenho = c("baixo", "baixo","alto", "medio","baixo","medio","alto","alto")
desempenho
## [1] "baixo" "baixo" "alto" "medio" "baixo" "medio" "alto" "alto"
Transformamos o vetor desempenho em fator fazendo.
desempenho1 = factor(desempenho)
desempenho1
## [1] baixo baixo alto medio baixo medio alto alto
## Levels: alto baixo medio
Observe que os níveis do fator estão ordenados segundo a ordem alfabética de seus nomes. Quando desejarmos uma outra ordenação dos níveis do fator, isto pode ser feito usando o argumento levels da função factor, onde especificamos a ordem desejada. Para que os níveis sejam ordenados na ordem baixo, médio, alto, fazemos:
desempenho1 = factor(desempenho,levels=c("baixo","medio","alto"))
desempenho1
## [1] baixo baixo alto medio baixo medio alto alto
## Levels: baixo medio alto
Para algumas análises a informação da ordem dos fatores não importa, mas para outras sim. Informamos que a ordem é importante fazendo o argumento ordered. igual a TRUE.
desempenho1 = factor(desempenho,levels=c("baixo","medio","alto"),ordered=TRUE)
desempenho1
## [1] baixo baixo alto medio baixo medio alto alto
## Levels: baixo < medio < alto
Observe que o output acima retorna o ordenamento dos níveis do fator.
Para criamos um novo fator, denominado de tipo_esporte, com a classificação dos esportes em individual ou coletivo, primeiro fazemos:
tipo_esporte = esportes # faz tipo de esporte igual a esportes
levels(tipo_esporte) # retorna os niveis da variavel tipo_esporte
## [1] "basquete" "futebol" "handebol" "hipismo" "judô" "tenis"
Agora redefinimos os níveis da variável tipo_esporte atribuindo a cada um dos níveis originais do fator os novos labels. Por exemplo, ao primeiro nível, basquete, associamos o label coletivo, ao segundo nível, futebol, também associamos o label coletivo, e assim por diante. O codigo usado para isto é o seguinte.
levels(tipo_esporte)=c("coletivo","coletivo","coletivo","individual","coletivo","coletivo")
tipo_esporte
## [1] coletivo individual coletivo coletivo coletivo coletivo coletivo
## [8] coletivo
## Levels: coletivo individual
Observe que o fator tipo_esporte tem agora 2 níveis, coletivo e individual.
Matriz é um conjunto de vetores de mesmo comprimento que são organizados lado a lado. Uma matriz, assim como um vetor, deve conter somente elementos do mesmo tipo, isto é, uma matriz só poderá conter vetores numéricos, lógicos ou de caracteres.
Para construir uma matriz vamos usar a função matrix()
, que cria uma matriz a partir de um conjunto de valores. Esta função tem como argumentos o conjunto de valores (data), o número de linhas (nrow) e o número de colunas (ncol).
Considere que 58 peças do tipo A e 58 peças do tipo B foram inspecionadas e classificadas segundo a presença de defeito, obtendo-se 12 defeituosas entre as do tipo A e 20 defeituosas entre as do tipo B. Como exemplo, vamos criar uma matriz, de nome M, com estes valores, representando a variável tipo da peça nas linhas e a variável presença de defeitos nas colunas, como mostrado na tabela seguinte:
Tipo de peça | Presença de defeitos | |
---|---|---|
Sim | Não | |
A | 12 | 46 |
B | 20 | 38 |
Para dispor os elementos do vetor na forma de uma matriz é preciso informar o número de colunas da matriz com o argumento ncol, neste caso igual a 2.
M = matrix(data = c(12,20,46,38), ncol = 2)
M
## [,1] [,2]
## [1,] 12 46
## [2,] 20 38
Note que os elementos do vetor data foram dispostos na matriz no sentido das colunas. Caso deseje preencher a matriz seguindo o sentido das linhas faça o argumento byrow igual a TRUE, como mostrado a seguir:
M = matrix(c(12,20,46,38), ncol = 2,byrow=T)
M
## [,1] [,2]
## [1,] 12 20
## [2,] 46 38
Nesse caso a variavel tipo de peça corresponde às colunas e a variável presença de defeito ás linhas da tabela.
É possível adicionar nomes às colunas e às linhas da matriz usando o comando dimnames" e com o auxílio do objeto lista, list()
, como mostrado abaixo:
M = matrix(c(12,20,46,38), ncol = 2, dimnames = list(c("Peças A","Peças B"),c("Com defeito","Sem defeito")))
M
## Com defeito Sem defeito
## Peças A 12 46
## Peças B 20 38
As funções colnames e rownames também pode ser usadas para nomear as colunas e linhas de uma matriz. Por exemplo, para quiséssemos mudar os nomes das colunas da matriz M para “defeituosos” e não defeituosos”, basta fazer:
colnames(M) = c("Defeituosos","Não defeituosos")
M
## Defeituosos Não defeituosos
## Peças A 12 46
## Peças B 20 38
Os elementos da matriz são identificados pela linha e coluna da matriz em que se encontram. Para obtermos o elemento pertencente à linha i e à coluna j da matriz M, usamos o código M[i,j]. Por exemplo:
M[1,1] # retorna o elemento pertencente à primeira linha e primeira coluna de M
## [1] 12
M[2,1] # retorna o elemento pertencente à segunda linha e primeira coluna de M
## [1] 20
Para obter uma linha (coluna) inteira da matriz indique a sua posição e deixe em branco a posição da coluna (linha), como mostrado nos exemplos seguintes.
M[1,] #retorna a primeira linha da matriz M
## Defeituosos Não defeituosos
## 12 46
M[,1] # retorna a primeira coluna da matriz
## Peças A Peças B
## 12 20
Elementos da matriz podem ser modificados de maneira similar ao visto para os vetores.
Existem diversos outras funções para obter informações sobre a matriz criada, alguns deles são:
dim(M)
## [1] 2 2
A matriz “M” é composta por 2 linhas e 2 colunas.
length(M)
## [1] 4
A matriz “M” possui 4 elementos.
sum(M)
## [1] 116
A soma de todos os elementos da matriz resulta em 116.
rowSums(M)
## Peças A Peças B
## 58 58
colSums(M)
## Defeituosos Não defeituosos
## 32 84
M[1,1]/sum(M[1,]) #Proporção de peças A com defeito
## [1] 0.2068966
M[1,1]/sum(M[,1]) #Proporção de peças defeituosas do tipo A
## [1] 0.375
sum(M[,1])/sum(M) #Proporção total de peças com defeito
## [1] 0.2758621
t(M)
## Peças A Peças B
## Defeituosos 12 20
## Não defeituosos 46 38
solve(M)
## Peças A Peças B
## Defeituosos -0.08189655 0.09913793
## Não defeituosos 0.04310345 -0.02586207
Considere que 2 profissionais inspecionaram 50 peças e as classificaram quanto a presença ou não de defeitos. Os resultados obtidos são dados na matrix D,onde na linha temos as avaliações do profissional A e nas colunas as avaliações do profissional B.
D = matrix(c(12,20,46,38), ncol = 2, dimnames = list(c("não defeituosa","defeituosa"),c("não defeituosa","defeituosa")))
D
## não defeituosa defeituosa
## não defeituosa 12 46
## defeituosa 20 38
A funçao diag() retorna os elementos da diagonal da matriz e somando os valores destes elementos temos o total de classificações concordantes.
diag(D)
## não defeituosa defeituosa
## 12 38
sum(diag(D))
## [1] 50
diag(M)
## [1] 12 38
Além dos comandos apresentados existem também outros modos de criar matrizes e realizar operações matriciais a partir delas, como por exemplo:
M1 = matrix(0,ncol=3,nrow=2) #Cria uma matriz nula de 3 colunas e 2 linhas
M1
## [,1] [,2] [,3]
## [1,] 0 0 0
## [2,] 0 0 0
M2 = diag(4,nrow=3) #Cria uma matriz diagonal de ordem 3 e com todos os elementos da diagonal principal iguais a 4
M2
## [,1] [,2] [,3]
## [1,] 4 0 0
## [2,] 0 4 0
## [3,] 0 0 4
M3 = diag(c(1,2,3)) #Cria uma matriz diagonal com elementos iguais ao elementos de um vetor
M3
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 2 0
## [3,] 0 0 3
M4 = cbind(1:4, 6:9) #Cria a matriz combinando as colunas formadas pelos vetores 1:4 e 6:9.
M4
## [,1] [,2]
## [1,] 1 6
## [2,] 2 7
## [3,] 3 8
## [4,] 4 9
A função cbind(rbind) combina objetos do R, que podem ser vetores, matrizes ou data.frame no sentido das colunas(linhas).
M5 = rbind(3:5,9:11) #Cria a matriz combinando as linhas formadas pelos vetores 3:5 e 9:11.
M5
## [,1] [,2] [,3]
## [1,] 3 4 5
## [2,] 9 10 11
M6 = M2 + M3 #Soma cada elemento da matriz M2 com o elemento correspondente da matriz M3
M6
## [,1] [,2] [,3]
## [1,] 5 0 0
## [2,] 0 6 0
## [3,] 0 0 7
M7 = M2 * M3 #Multiplica cada elemento da matriz M2 com o elemento correspondente da matriz M3
M7
## [,1] [,2] [,3]
## [1,] 4 0 0
## [2,] 0 8 0
## [3,] 0 0 12
M8 = M4 %*% M5 #multiplicação matricial das matrizes M4 e M5
M8
## [,1] [,2] [,3]
## [1,] 57 64 71
## [2,] 69 78 87
## [3,] 81 92 103
## [4,] 93 106 119
Vetores e matrizes são objetos que podem conter observação de uma única classe. Entretanto, quando analisamos dados geralmente nossas planilhas de dados contém variáveis de diferentes classes, como por exemplo sexo (caracter) e idade (numérica). Numa planilha de dados, geralmente, cada linha corresponde a um indivíduo e cada coluna a uma variável. Data frames são o objeto do R adequado para armazenar planilhas de dados com esta características. Num data frame cada coluna é formada por objetos da mesma classe.
O R possui um pacote chamado”datasets”, que possui muitos arquivos de dados, muitos deles no formato de data.frames. Cada pacote do R tem seus próprios conjuntos de dados. Para saber quais são estes conjuntos de dados, executamos o código data()
, que retorna para cada um dos pacotes carregados na sessão, os conjuntos de dados disponíveis.
Um dos arquivos de dados disponíveis é o arquivo cars, que possui informações de velocidade e distância percorrida para 50 automóveis. Para utilizar este conjunto de dados é preciso carregá-lo, o que é feito fazendo:
data(cars) # carrega o arquivo de dados
O arquivo pode ser visualizado na primeira janela do RStudio, executando o código View(cars)
ou pode ser mostrado na janela console executando o código cars
. Para visualizarmos somente as primeiras linhas do data.frame usamos a função head()
e para vermos as últimas linhas, usamos a função tail()
. Estas funções também são aplicáveis a vetores.
head(cars)
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
tail(cars)
## speed dist
## 45 23 54
## 46 24 70
## 47 24 92
## 48 24 93
## 49 24 120
## 50 25 85
Os elementos de um data.frame, assim como os elementos de uma matriz são indexados pela linha e coluna aos quais pertencem e praticamente todos os recursos vistos para seleção e modificação dos elementos de uma matriz aplicam-se também aos dataframes. Por exemplo, cars[1,]
retorna os valores de todas as variáveis para o automóvel presente na primeira linha do data.frame e cars[,1]
ou cars[,“speed”]
retorna os valores da variável velocidade (speed) para os 50 automóveis.
As variáveis (colunas) de um data.frame são mais facilmente acessadas escrevendo nome do data.frame seguido do símbolo $ e do nome da variável, como mostrado no exemplo seguinte:
cars$speed # retorna os valores da variável speed
## [1] 4 4 7 7 8 9 10 10 10 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15
## [26] 15 16 16 17 17 17 18 18 18 18 19 19 19 20 20 20 20 20 22 23 24 24 24 24 25
mean(cars$speed) # calcula a média da variável speed
## [1] 15.4
Uma outra maneira de acessar a variável speed data.frame cars é escrevendo cars[[“speed”]].
Os objetos retornados pelos códigos cars$peed
e cars[[“speed”]]
são vetores. Para que o R retorne objetos do tipo data.frame use cars[“speed“]
ou cars[,“speed“,drop=F]
.
Nome | Idade | Salário | Estado Civil |
---|---|---|---|
Joaquim | 24 | 5000 | solteiro |
Francisca | 30 | 4000 | casado |
João | 62 | 3700 | casado |
Teresa | 19 | 1200 | solteiro |
Luis | 36 | 3500 | casado |
O data.frame de nomes dados é criado concatenado os vetores contendo as informações de cada variável.
dados<-data.frame(nome = c("Joaquim", "Francisca", "Joao", "Teresa", "Luis"), idade = c(24,30,62,19,36), salario = c(5000,4000,3700,1200,3500), estado_civil = c("solteiro", "casado", "casado","solteiro","casado"))
dados
## nome idade salario estado_civil
## 1 Joaquim 24 5000 solteiro
## 2 Francisca 30 4000 casado
## 3 Joao 62 3700 casado
## 4 Teresa 19 1200 solteiro
## 5 Luis 36 3500 casado
Linhas e colunas são facilmente acrescentadas ao data frame. Apresentamos a seguir diferentes maneiras para acrescentar uma variável contendo informação do sexo das 5 pesoas. Observe o exemplo:
dados$sexo = c("M", "M", "F", "F", "F")
Outras formas são:
- dados[,”sexo”] = c(“M”, “M”, “F”, “F”, “F”)
- dados[[“$sexo”]] = c(“M”, “M”, “F”, “F”, “F”)
- cbind(dados,sexo = c(“M”,“M”,“F”,“F”,“F”), stringsAsFactors = FALSE))
O argumento stringsAsFactors = FALSE indica que as variáveis do tipo caracter não devem ser consideradas como fatores.
Se quisermos acrescentar uma linha ao data frame com os dado de Joana, podemos usar um dos 2 caminhos seguintes:
dados[6,] = data.frame(nome="joana",idade="28",salario=5000, estado_civil="casado")
A outra forma é:
- rbind(dados, data.frame(nome="joana",idade="28",salario=5000, estado_civil = "casado"), stringsAsFactors = FALSE)
Observe que a nova linha foi construída como um data.frame, pois este objeto, ao contrário do vetor, pode conter observação de diferentes classes.
Uma lista pode ser vista como um vetor de objetos onde estes objetos podem ser de diferentes tipos e é criada com a função list().
Vamos criar uma lista com 3 objetos: um vetor A, com os valores de 1 a 5, um vetor B, com as letras X, Y e Z e uma matriz C, contendo na diagonal os elementos do vetor A.
A = seq(1:5)
B = c("X","y","Z")
C = diag(A,nrow=5)
lista=list(A=A,B=B,C=C)
Um elemento da lista pode ser acessado de diferetes maneiras. Por exemplo, para acessar o elemento B podemos usar um dos seguintes codigos:
lista[2]
## $B
## [1] "X" "y" "Z"
lista["B"]
## $B
## [1] "X" "y" "Z"
Essas formas de acessar um objeto da lista retornam o objeto, mas não permitem acessar os seus elementos. Observe que o código lista[2][1] não retorna o primeiro elemento do vetor B, mas todo o vetor.
lista[2][1]
## $B
## [1] "X" "y" "Z"
Para acessar os elementos do componente da lista, devemos usar colchetes duplos, como no exemplo seguinte:
lista[[2]] # retorna o vetor B, segundo objeto da lista
## [1] "X" "y" "Z"
lista[[2]][1] # retorna o primeiro elemento do vetor B, segundo elemento da lista
## [1] "X"
lista[["C"]] # retorna a matriz C, terceiro objeto da lista
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 0 0 0 0
## [2,] 0 2 0 0 0
## [3,] 0 0 3 0 0
## [4,] 0 0 0 4 0
## [5,] 0 0 0 0 5
lista[["C"]][1,1] # retorna o elemento contido na primeira linha e primeira coluna da matriz C, contida na lista
## [1] 1
Os pacotes são de extrema importância no R pois eles vieram para complementar e maximizar ações do R base. Um pacote é constituído de funções extras e conjuntos de dados devidamente documentados que permitem, que implementam novas técnicas de manipulação de dados.
Vimos na seção 1.1.3 como instalar um pacote do repositório CRAN a partir do menu disponível no painel 4 do Rstudio. Um pacote deste repositório pode ser instalado usando a função install. Um pacote que utilizaremos mais tarde é pacote packHV. para instalá-lo faça:
install.packages("packHV")
Para visualizar todos os pacotes instalados no seu computador use o comando:
installed.packages(")
Para remover um pacote use a função remove.packages(pkgs = “nome do pacote”)
e para atualizá-lo use a função update,package(pkgs = “nome do pacote” )
. Para saber se um pacote necessita de atualização execute o cÓdigo o old.packages()
.
Uma função no R, como em outras linguagens de programação é um codigo escrito para realizar uma tarefa específica, necessitando para isto de algumas informações(argumentos) e retornando o resultados obtidos após a sua realização. Esse codigo forma um objeto unitário e recebe um nome que é usado para acessá-lO sempre que desejar executá-lo.
Utilizamos até aqui várias funções do R. Por exemplo: a função mean(), tendo com argumento um vetor de dados retorna a média deste conjunto de dados; a função t(), recebendo como argumento uma matriz, retorna a sua transposta.
Existem funções já construídas e disponibilizadas nos vários pacotes do R para muitas tarefas que desejamos realizar. Cada pacote possui um conjunto de funções proprias e para acessá-las é preciso antes disto carregar o pacote, se ele já tiver sido instalado. Entretanto, para muitas outras tarefas, estas funções não existem,mas podemos construí-las.
A sintaxe básica de uma funçção R é dada no quadro seguinte:
Sintaxe de uma função: nome = function (argumento 1 , … , argumento n) { instruções da função return(o que deseja que seja retornado) } |
---|
No código acima, arg1,….., argn são os argumentos de entrada da função, ou seja os elementos que o usuário precisa informar para a execução da função. No espaço entre os 2 símbolos de chave são escritas as instruções da função. A função return especifica o elemento de saída, ou seja o elemento que a função deve retonar como resultado. O elemento de saída desve ser formado por um único objeto R, que pode ser um número, um vetor, uma lista, um gráfico, etc.
Para exemplificar, vamos construir uma função nomeada por JC que retorna o valor acumulado em juros durante certo período de tempo de nome, por um capital sujeito à uma taxa efetiva anual de juros constante, a partir dos argumentos: capital taxa e tempo. Para isto, vamos usar o resultado: \[Juros=capital((1+taxa)^{tempo}-1)\].
JC=function(capital, taxa, tempo){
juros=capital*((1+taxa)^tempo-1)
names(juros)="Juros"
return(juros)}
Aplicando a função JC com os argumentos capital = 1000, tempo = 1,5 anos e taxa = 0,05, obtemos:
JC(capital=1000, taxa=0.05, tempo=1.5)
## Juros
## 75.92983
Se mantivermos a ordem dos argumentos como definida na função podemos suprimir seus nomes ao utilizá-la.
JC(1000, 0.05, 1.5)
## Juros
## 75.92983
Com a função args podemos verificar os argumentos de qualquer função. Por exemplo:
args(JC)
## function (capital, taxa, tempo)
## NULL
Vamos modificar a função juros para que ela também retorne o montante, isto é o capital acumulado ao longo do período, e os valores dos argumentos utilizados. Como resultado, vamos criar uma lista contendo todas estas quantidades.
JC=function(capital, taxa, tempo){
juros=capital*((1+taxa)^tempo-1)
montante=capital+juros
imputs=c(capital,taxa,tempo)
names(imputs)=c("Capital","Taxa","Tempo")
resultado=list(imputs, juros,montante)
names(resultado)=c("Argumentos_Utilizados","Juros","Montante")
return(resultado)}
Observe abaixo os resultados obtidos com a utilização da funçao:
JC(1000, 0.05, 1.5)
## $Argumentos_Utilizados
## Capital Taxa Tempo
## 1000.00 0.05 1.50
##
## $Juros
## [1] 75.92983
##
## $Montante
## [1] 1075.93
Muitas vezes é interessante estabelecermos valores padrão para um ou mais argumentos da função, isto é, valores que serão assumidos casos eles não sejam especificados pelo usário. Por exemplo, para a função JC queremos estabelecer uma taxa de juros padrão igual a 0,05. Isto é feito fazendo taxa = 0.05 ao especificar o argumento taxa no código da função, como mostrado a seguir.
JC=function(capital, taxa = 0.05, tempo){
juros=capital*((1+taxa)^tempo-1)
montante=capital+juros
imputs=c(capital,taxa,tempo)
names(imputs)=c("capital","Taxa","Tempo")
resultado=list(imputs, juros,montante)
names(resultado)=c("Argumentos_Utilizados","JUros","Montante")
return(resultado)}
JC(1000, 0.05, 1.5)
## $Argumentos_Utilizados
## capital Taxa Tempo
## 1000.00 0.05 1.50
##
## $JUros
## [1] 75.92983
##
## $Montante
## [1] 1075.93
Agora vamos incluir como resultado da função um gráfico mostrando a evolução do montante ao longo do tempo. Este gráfico será criado com a função \(curve\), que traça a curva para uma função qualquer, \(f(x)\), no intervalo especificado pelos argumentos from e to.
JC=function(capital, taxa = 0.05, tempo){
juros=capital*((1+taxa)^tempo-1)
montante=capital+juros
imputs=c(capital,taxa,tempo)
names(imputs)=c("capital","Taxa","Tempo")
curve(capital*(1+taxa)^x, from=0,to=tempo,xlab="tempo(anos",ylab="Montante",col="red")
resultado=list(imputs, juros,montante)
names(resultado)=c("Argumentos_Utilizados","JUros","Montante")
return(resultado)}
JC(1000, 0.05, 30)
## $Argumentos_Utilizados
## capital Taxa Tempo
## 1e+03 5e-02 3e+01
##
## $JUros
## [1] 3321.942
##
## $Montante
## [1] 4321.942
Por fim, ressaltamos que uma função construída pelo usuário fica disponivel para uso, enquanto durar a sessão de trabalho, após a execução de seu código.