(1 + sqrt(5))/2
(1 + 5^(1/2))/2
1/0
## [1] Inf
-1/0
## [1] -Inf
NaN
, NULL
, NA
e Inf
?NaN
quer dizer “Not a number”, ele aparece quando o resultado de uma expressão matemática não está definida.NA
significa “Not Available” e simboliza informação ausente/faltante. Usamos NA principalmente para representar dados faltantes em bancos de dados.NULL
significa vazio, “nada”. Quando queremos que uma função não retorne nada, fazemos ela devolver NULL
.Inf
representa o infinito, como no limite de funções matemáticas. Valores muito grandes (10e+308) e 1/0
retornam Inf
(com I maiúsculo).4.a) Tente mentalmente calcular o que dá a conta 5 + 3 * 10 %/% 3 == 15
no R, sem rodar.
14 == 15
## [1] FALSE
4.b) Adicionando apenas parênteses, faça a expressão acima retornar o resultado contrário.
5 + (3 * 10) %/% 3 == 15
## [1] TRUE
1.a) O que acontece se eu rodar
x <- 4
if(x = 4) {
'isso aqui apareceu'
}
x
R: Dará um erro de que coisas inesperadas ocorreram.
Você notou alguma coisa estranha? Como o R se comporta nesse caso?
R: A condição do if está utilizando o operador “=” em vez do “==”.
1.b) Como você modificaria esse código para não dar erro e aparecer a frase ‘isso aqui apareceu’? Obs: Existem duas formas de modificar o código que farão ele funcionar.
R: Forma I
if(x == 4) {
'isso aqui apareceu'
}
## [1] "isso aqui apareceu"
x
## [1] 4
R: Forma II
if(x <- 4) {
'isso aqui apareceu'
}
## [1] "isso aqui apareceu"
x
## [1] 4
Esta segunda forma mostra uma das diferenças entre os operadores de atribuição =
e <-
.
1 elefante(s) incomoda(m) muita gente
2 elefante(s) incomoda(m) incomoda(m) muito mais
3 elefante(s) incomoda(m) muita gente
4 elefante(s) incomoda(m) incomoda(m) incomoda(m) incomoda(m) muito mais
usando for
ou while
.
R: Utilizando for
:
n <- 4 # número de repetições
for(i in 1:n) {
parte1 <- paste(i, "elefante(s)")
parte2 <- ""
for(j in 1:ifelse(i%%2 == 0, i, 1)) {
parte2 <- paste(parte2, "incomoda(m)")
}
parte3 <- ifelse(i%%2 == 0, "muito mais", "muita gente")
verso <- paste(parte1, parte2, parte3)
print(verso)
}
## [1] "1 elefante(s) incomoda(m) muita gente"
## [1] "2 elefante(s) incomoda(m) incomoda(m) muito mais"
## [1] "3 elefante(s) incomoda(m) muita gente"
## [1] "4 elefante(s) incomoda(m) incomoda(m) incomoda(m) incomoda(m) muito mais"
variancia <- function(x) {
media <- mean(x)
n <- length(x)
var <- sum((x - media)^2)/n
return(var)
}
x <- 1:100
utilizando a sua funcao criada no item 1 e utilizando a funcao var()
do R. Compare seus resultados. Eles coincidem? Por que?x <- 1:100
variancia(x)
## [1] 833.25
var(x)
## [1] 841.6667
R: Elas não coincidem, pois a função var()
do R calcula a variância amostral (dividido por n - 1 ) em vez da variância populacional (dividido por n).
variancia <- function(x, populacional = TRUE) {
media <- mean(x)
n <- length(x)
if(!populacional) {
n <- n - 1
}
var <- sum((x - media)^2)/n
return(var)
}
# teste
variancia(x)
## [1] 833.25
variancia(x, FALSE)
## [1] 841.6667
v1
e v2
, e retorne a média ponderada de v1
por v2
. Calcule a média ponderada do vetor v1 <- c(11, 9, 8, 7, 11, 6, 7, 9)
utilizando como pesos o vetor v2 <- c(1, 2, 1, 2, 1, 2, 1, 2)
. BÔNUS: certifique que o usuario tenha passado vetores de tamanhos iguais e ambos numéricos. Retorne NULL
caso uma dessas condições falhe.media_ponderada <- function(v1, v2) {
if(!is.numeric(v1) | !is.numeric(v2) | length(v1) != length(v2)) { # BÔNUS
NULL
}
sum(v1*v2/sum(v2))
}
v1 <- c(11, 9, 8, 7, 11, 6, 7, 9)
v2 <- c(1, 2, 1, 2, 1, 2, 1, 2)
media_ponderada(v1, v2)
## [1] 8.25
paste()
que una palavras pulando linhas (\\n
)meu_paste <- function(...) {
paste(..., sep = "\n")
}
# Teste
teste <- meu_paste("print()", "não pula linha", "cat()", "pula linha")
print(teste)
## [1] "print()\nnão pula linha\ncat()\npula linha"
cat(teste)
## print()
## não pula linha
## cat()
## pula linha
<-
), e os números, separando cada expressão pulando linhas. Por exemplo:x <- letters[1:10]
y <- 10:1
imprime_coisas_legais(x, y)
a <- 10
b <- 9
c <- 8
d <- 7
e <- 6
f <- 5
g <- 4
h <- 3
i <- 2
j <- 1
R:
imprime_coisas_legais <- function(x, y) {
for(i in seq_along(x)) {
print(paste(x[i], "<-", y[i]))
}
}
x <- letters[1:10]
y <- 10:1
imprime_coisas_legais(x, y)
## [1] "a <- 10"
## [1] "b <- 9"
## [1] "c <- 8"
## [1] "d <- 7"
## [1] "e <- 6"
## [1] "f <- 5"
## [1] "g <- 4"
## [1] "h <- 3"
## [1] "i <- 2"
## [1] "j <- 1"
1. O senhor Adalberto é dono de uma loja e, utilizando o R, ele quer criar um cadastro de seus clientes. Para isso, ele está armazenando as informações em uma matriz da seguinte maneira:
cadastro <- matrix(c(NA, NA, NA, NA), nrow = 100, ncol = 4,
dimnames = list(NULL, c("Nome", "Idade", "Cidade", "Telefone")))
cadastro[1,] <- c("Maria das Dores", 56, 3025-111, "São Paulo")
cadastro[2,] <- c("José Aníbal", 40, 3333-012, "Santos")
cadastro[3,] <- c("Pedro Silva", 23, 3091-777, "São Paulo")
# ...
O que faz o argumento dimnames =
? O que significa o primeiro argumento da lista ser NULL
?
O que vai acontecer se o senhor Adalberto tentar tirar a média da idade dos seus clientes fazendo mean(cadastro[,2])
? Como ele poderia calcular essa média sem mudar a estrutura do objeto cadastro
?
No lugar de matrix
, qual seria a melhor estrutura para se utilizar neste caso?
2. Por que 0.1 == 0.3/3
retorna FALSE
?
1. Considere o data.frame
diamonds do R:
Como você faria para permutar aleatoriamente as colunas?
É possível permutar linhas e colunas simultaneamente em um passo?
Como ordenar as colunas do banco de dados em ordem alfabética?
Crie uma nova variável no banco de dados que seja 1 se o preço (price
) for menor 300 e 0 caso contrário.
2. Considere o vetor abaixo:
x1 <- 1:8
Por que a expressao x1 == c(2,3)
não retorna as posições de x1
que são iguais a 2 ou 3?
O que faz o operador %in%
?
"Desktop/pasta1/pasta2"
e que dentro da pasta2 você tenha uma pasta3. Sem mudar o diretório de trabalho, escreva um código, utilizando a função read.table()
, para ler um arquivo que estejaÉ possível ler um arquivo em que o separador de valores (sep
) é igual ao separador de casas deciamais (dec
)?
Qual a diferença entre as funções read.csv()
e read.csv2()
?
%>%
.x <- 0.1
library(ggplot2)
qplot(x=sample(sqrt((log(seq(1, 10, x)) + 2)), 40, replace = T), geom="histogram")
## Warning in sample.int(length(x), size, replace, prob): '.Random.seed' is
## not an integer vector but of type 'double', so ignored
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
%<>%
?%T>%
?%$%
?1. Considere o gráfico abaixo:
x <- seq(-3, 3, 0.01)
y <- 1/x
plot(x, y, type = "l")
Altere os limites do eixo x para que o gráfico seja visualizado apenas do -2 ao 2.
Acrescente um título ao grafico.
2. Como construir dois gráficos na mesma janela?