Se listarmos todos os números naturais abaixo de 10 que são múltiplos de 3 ou 5, obtemos 3, 5, 6 e 9.
A soma desses múltiplos é 23 e a média é 5,75.
Encontre a média e soma de todos os múltiplos de 3 ou 5 abaixo de 1000.
Faça uma função.
#----------------- Alternativa 1 -------------------------------#
vetor <- 1:9
N <- length(vetor)
div3ou5_log <- logical(N)
for (i in 1:N) {
if (vetor[i] %% 3 == 0 | vetor[i] %% 5 == 0) {
div3ou5_log[i] <- TRUE
}
}
sum(vetor[div3ou5_log])
mean(vetor[div3ou5_log])
#----------------- Alternativa 2 -------------------------------#
vetor <- 1:9
div3ou5_log <- ifelse(vetor %% 3 == 0 | vetor %% 5 == 0, TRUE, FALSE)
sum(vetor[div3ou5_log])
mean(vetor[div3ou5_log])
#----------------- Função --------------------------------------#
func_div3ou5 <- function(max_n) {
vetor <- 1:max_n
div3ou5_log <- ifelse(vetor %% 3 == 0 | vetor %% 5 == 0, TRUE, FALSE)
div3ou5 <- vetor[div3ou5_log]
return(list(media = mean(div3ou5), soma = sum(div3ou5)))
}
func_div3ou5(999)
Obter um resumo de determinadas variáveis de um banco de dados. Acesse os dados em: https://gmarcatti.github.io/dados/dados.xlsx Seguir os passos descritos abaixo.
a. Executar os comandos abaixo:
# carregar pacote para leitura dos dados
library(readxl)
# especificar o caminho dos dados de seu computador
dados <- read_excel(“C:/aulas/dados_prog/dados.xlsx”)
b. Obter a média e o desvio padrão (funções: mean e sd) para as variáveis volume e hd (altura dominante) para cada um dos talhões (variável chave_talhao) disponíveis na base de dados. Detalhe importante: o resumo deve ser restrito apenas a última observação (medição) de cada parcela (variável parc), isto é, observação de maior idade de cada parcela (medição mais atual).
#----------------- Alternativa 1 -------------------------------#
library(readxl)
library(tibble)
dados <- read_excel("C:/aulas/dados_prog/dados.xlsx")
print(dados, n = 20)
# 1 identificar e quantificar os grupos
#dados$talhao_parc <- paste(dados$chave_talhao, dados$parc, sep = "-")
uni_parc <- unique(dados$parc) #talhao_parc
N <- length(uni_parc)
# 2 criar data.frame para receber os resultados
d_ultima <- tibble(chave_talhao = character(N), parc = integer(N),
idade = numeric(N), volume = numeric(N),
hd = numeric(N))
# 3 como acessar os elementos
indx_max <- which.max(dados$idade)
dados[indx_max, ]
# 4 loop
for (i in 1:N) {
d_parc <- subset(dados, parc == uni_parc[i])
indx_max <- which.max(d_parc$idade)
parc_ul <- d_parc[indx_max, ]
d_ultima[i, "chave_talhao"] <- parc_ul$chave_talhao
d_ultima[i, "parc"] <- parc_ul$parc
d_ultima[i, "volume"] <- parc_ul$volume
d_ultima[i, "hd"] <- parc_ul$hd
d_ultima[i, "idade"] <- parc_ul$idade
}
# 1 identificar e quantificar os grupos
uni_talhao <- unique(d_ultima$chave_talhao)
N <- length(uni_talhao)
# 2 criar data.frame para receber os resultados
ests <- tibble(chave_talhao = character(N),
vol_m = numeric(N), vol_dp = numeric(N),
hd_m = numeric(N), hd_dp = numeric(N))
# 3 como acessar os elementos
mean(dados$volume)
sd(dados$volume)
# 4 loop
for (i in 1:N) {
d_talhao <- subset(d_ultima, chave_talhao == uni_talhao[i])
ests[i, "chave_talhao"] <- uni_talhao[i]
ests[i, "vol_m"] <- mean(d_talhao$volume)
ests[i, "vol_dp"] <- sd(d_talhao$volume)
ests[i, "hd_m"] <- mean(d_talhao$hd)
ests[i, "hd_dp"] <- sd(d_talhao$hd)
}
#----------------- Alternativa 2 -------------------------------#
# carregar pacotes necessários
library(readxl)
library(dplyr)
library(stringr)
library(tibble)
# especificar o caminho dos dados de seu computador
dados <- read_excel("C:/aulas/dados_prog/dados.xlsx")
group_tp <- group_by(dados, chave_talhao, parc)
ultima_tp <- slice(group_tp, which.max(idade))
group_talhao <- group_by(ultima_tp, chave_talhao)
ests_talhao <- summarise(group_talhao, vol_m = mean(volume), vol_dp = sd(volume),
hd_m = mean(hd), hd_dp = sd(hd), n = n())
# extra: ordenar por nome do talhao
numeros <- sub(".", "", ests_talhao$chave_talhao)
ests_talhao$talhao <- paste0("T", str_pad(numeros, max(nchar(numeros)), pad = "0"))
ests_talhao_ord <- arrange(ests_talhao, talhao)
#----------------- Alternativa 3 -------------------------------#
dados_result <- dados %>%
group_by(chave_talhao,parc) %>%
filter(idade == max(idade)) %>%
group_by(chave_talhao) %>%
summarise_at(vars(hd,volume), list(~ mean(.,na.rm = TRUE), ~ sd(., na.rm = TRUE)) )
dados_result
Ajustar um modelo, de volume em função da idade (escolha o modelo de sua preferência), para cada uma das classes prec_mm (Precipitações) utilizando um loop de sua preferência. O resultado final deverá ser uma data.frame (ou tibble) com a quantidade de linhas igual ao número de classes de precipitações e contendo as seguintes colunas: prec_mm, b0, b1, R2. Esta última coluna é o coeficiente de determinação (medida de qualidade ajuste). Faça a plotagem dos ajustes também, pode ser algo semelhante ao apresentado em aula.
library(readxl)
library(tibble)
dados <- read_excel("C:/aulas/dados_prog/dados.xlsx")
# 1
uni_prec <- unique(dados$prec_mm)
N <- length(uni_prec)
# 2
coefs <- tibble(prec_mm = numeric(N), b0 = numeric(N),
b1 = numeric(N), r2 = numeric(N))
# 3
lm_geral <- lm(volume ~ idade, dados)
coef(lm_geral)[[1]]
coef(lm_geral)[[2]]
cor(dados$volume, fitted(lm_geral))^2
# 4
plot(dados$idade, dados$volume, xlab = "Idade (anos)",
ylab = "Volume (m³/ha)")
for (i in 1:N) {
d_i <- subset(dados, prec_mm == uni_prec[i])
lm_i <- lm(volume ~ idade, d_i)
b0 = coef(lm_i)[[1]]
b1 = coef(lm_i)[[2]]
r2 = cor(d_i$volume, fitted(lm_i))^2
coefs[i, "prec_mm"] <- uni_prec[i]
coefs[i, "b0"] <- b0
coefs[i, "b1"] <- b1
coefs[i, "r2"] <- r2
abline(b0, b1, col = i)
}
coefs
Para ser número primo, um número deve ser divisível apenas por 2 números: 1 e por ele mesmo. Caso um número seja múltiplo de qualquer outro, ele não é primo. Em outras palavras, se um número é primo, o resto da divisão por qualquer outro número é diferente de zero, com exceção do número 1 e ele mesmo.
Os números primos entre 1 e 100 são: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97.
Formule um algoritmo e implemente uma função em código R para retornar os números primos de 1 a n. Sua função deverá apresentar apenas o n como argumento, e deverá retornar um vetor com os números primos de 1 a n.
Dicas: (1) Para obter o resto da divisão utilize %%. (2) Tente subdividir o problema em duas partes: 1º crie uma função que identifica se um número é primo ou não. 2º depois utilize essa função em um processo repetitivo para avaliar se os elementos de um vetor de 1:n são primos… os que forem primos devem ser armazenados em um vetor. Provavelmente as duas funções devem ter um loop.
e_primo <- function(num) {
if (num == 2) return(TRUE)
for (i in 2:(num - 1)) {
if (num %% i == 0) {
return(FALSE)
}
}
return(TRUE)
}
e_primo(13)
e_primo(15)
e_primo(947)
e_primo(2)
primos <- function(n) {
vetor_primo <- logical(n)
for (i in 1:n) {
if (e_primo(i)) {
vetor_primo[i] <- TRUE
}
}
return((1:n)[vetor_primo])
}
primos(100)
Discorra sobre os paradigmas de programação apresentados no curso: imperativo, funcional e matricial/vetorizado. Exemplo: fale um pouco sobre cada um, vantagens, desvantagens, usos, etc.