Capítulo 14 Exercícios de Revisão
1 Um pesquisador está a analisar os resultados de uma pesquisa que avalia a satisfação de clientes com três diferentes serviços (A, B e C). Abaixo estão os dados recolhidos, em que cada linha representa um cliente e cada coluna indica a pontuação (de 1 a 10) atribuída a cada serviço:
satisfacao <- data.frame(
servico_A = c(8, 5, 9, 6, 7, 4, 10, 6, 3, 7),
servico_B = c(7, 6, 8, 5, 8, 5, 9, 7, 4, 6),
servico_C = c(9, 4, 10, 6, 6, 3, 10, 5, 5, 8)
)Escreva uma função chamada
calcula_media()que receba o data framesatisfacaoe devolva um vetor com a média de satisfação de cada cliente (média das 3 colunas).Adicione ao data frame uma nova coluna chamada
media, contendo os valores calculados pela função.Com base na coluna
media, use um loopforcom estruturaif-elsepara classificar cada cliente como:
- “Satisfeito” se a média for maior ou igual a 7
- “Insatisfeito” caso contrário
Adicione uma nova coluna chamada classificacao ao data frame com essa informação.
2. Uma empresa registou o número de tarefas concluídas por 15 funcionários ao longo de 5 dias úteis. A meta da empresa é que cada funcionário realize pelo menos 20 tarefas por dia. Pretende-se agora verificar quem atingiu a meta em pelo menos 3 dos 5 dias.
Os dados estão organizados no seguinte data.frame, chamado tarefa_funcionarios, onde cada linha representa um funcionário e cada coluna um dia da semana:
tarefa_funcionarios <- data.frame(
dia1 = c(22, 18, 19, 25, 30, 15, 21, 24, 20, 19, 28, 26, 12, 20, 18),
dia2 = c(18, 21, 23, 20, 27, 18, 20, 25, 16, 21, 22, 29, 17, 19, 20),
dia3 = c(25, 17, 15, 18, 26, 16, 19, 30, 21, 18, 24, 20, 14, 23, 22),
dia4 = c(20, 19, 22, 26, 28, 20, 23, 22, 17, 25, 19, 18, 19, 21, 24),
dia5 = c(19, 22, 18, 27, 29, 14, 24, 28, 20, 23, 25, 27, 16, 17, 18)
)Escreva uma função chamada
verifica_meta()que receba o data.frame e devolva um vetor lógico indicando, para cada funcionário, se ele atingiu a meta em pelo menos 3 dias.Com base no vetor lógico obtido, use um
forcomif-elsepara criar um vetor chamadoclassificacaocom os valores:
- “Atingiu Meta” se o funcionário atingiu a meta em 3 ou mais dias
- “Não Atingiu Meta” caso contrário
- Adicione o vetor
classificacaocomo uma nova coluna do data.frametarefa_funcionarios.
3. Um estatístico está a estudar o comportamento da média amostral em diferentes populações. Para isso, simulou 6 amostras de tamanho 15 (valores entre 0 e 100), e pretende calcular a média de cada uma. A simulação deve interromper-se assim que for encontrada uma média superior a 75.
Os dados encontram-se na seguinte matriz chamada amostras:
amostras <- matrix(
c(
52, 68, 75, 48, 60, 55, 72, 81, 64, 70, 45, 69, 74, 60, 71,
49, 50, 63, 41, 59, 55, 67, 62, 58, 66, 61, 54, 65, 60, 57,
80, 82, 85, 79, 90, 88, 92, 85, 87, 84, 86, 81, 89, 83, 91,
30, 42, 51, 39, 35, 48, 46, 52, 41, 37, 45, 43, 38, 44, 36,
69, 74, 70, 66, 68, 72, 71, 73, 65, 67, 75, 64, 63, 62, 76,
55, 58, 61, 56, 60, 63, 57, 62, 64, 59, 65, 66, 68, 67, 69
),
nrow = 6,
byrow = TRUE
)Crie uma função chamada
calcula_media_amostra()que receba a matriz amostras e devolva a média de uma linha específica (dada por um índice).Escreva um ciclo
whileque percorra as linhas da matriz, calculando a média de cada amostra uma a uma. Se a média for superior a 75, o programa deve imprimir a mensagem: “Média Excedeu Limite” e parar a execução. Caso contrário, o programa deve continuar até processar todas as amostras.
4. Crie uma lista chamada listas_transformadas com comprimento 7, onde o elemento de índice \(i\) deve conter a seguinte sequência:
\[x = \left\{ \left( j^2 + i \right) \,\middle|\, j = 1, 2, \dots, i \right\}\] Ou seja, para cada \(i = 1, \dots, 7\), gera-se uma sequência com \(i\) elementos, em que cada elemento da sequência é calculado como:
\[x_j = j^2 + i\]
Exemplo: Para \(i = 3\), o vetor seria: \[\left[ 1^2 + 3,\, 2^2 + 3,\, 3^2 + 3 \right] = [4, 7, 12]\]
Crie a lista
listas_transformadasconforme descrito, utilizando um loopfor.Verifique o comprimento do último vetor da lista.
Escreva uma função chamada
soma_elementos()que receba uma lista como entrada e devolva um vetor com a soma de cada vetor contido na lista.Use a função
soma_elementos()para calcular a soma dos elementos de cada vetor da listalistas_transformadas.
5. Crie dois vetores \(x\) e \(y\), ambos com comprimento 60, cujos valores devem ser inteiros aleatórios escolhidos com repetição entre 0 e 999 (inclusive).
Gere os vetores \(x\) e \(y\) conforme descrito. Utilize
sample()comreplace = TRUE.Selecione os valores de \(y\) que são menores que 500 e cujos correspondentes em \(x\) (mesma posição) são múltiplos de 3.
Crie um novo vetor chamado
dif_absoluta, contendo o valor absoluto da diferença entre \(x\) e \(y\) (isto é, \(|x_i - y_i|\) para cada posição \(i\)).Calcule a média e o desvio padrão dos valores em
dif_absoluta.
6. Seja \(x\) um vetor de números reais aleatórios com comprimento 80, gerado a partir de uma distribuição normal com média 5 e desvio padrão 2.
Gere o vetor \(x\) com 80 observações da distribuição \(\mathcal{N}(5, 2)\), utilizando a função
rnorm().Calcule a média amostral \(\bar{x}\) do vetor \(x\).
Crie um novo vetor
resultado, onde o i-ésimo elemento é definido por:
\[z_i = \sqrt{ \left| x_i^3 - \bar{x}^2 \right| }\]
- Calcule o valor máximo, mínimo e a média do vetor
resultado.
7. Um climatologista está a estudar as temperaturas médias diárias em 12 cidades ao longo de uma semana (7 dias). O seu objetivo é calcular a temperatura média semanal de cada cidade e verificar se essa média está acima ou abaixo de uma temperatura de referência de 25ºC.
Os dados abaixo representam as temperaturas médias diárias (em ºC) registadas durante uma semana em cada cidade. Estes dados estão organizados num data.frame chamado temperaturas_cidades, onde:
- Cada linha representa uma cidade
- Cada coluna representa um dia da semana (segunda a domingo)
temperaturas_cidades <- data.frame(
segunda = c(28, 22, 25, 19, 30, 24, 21, 26, 27, 23, 31, 20),
terca = c(29, 24, 23, 20, 32, 25, 22, 27, 26, 24, 33, 21),
quarta = c(30, 25, 22, 18, 33, 26, 23, 28, 25, 22, 34, 22),
quinta = c(31, 23, 24, 17, 31, 27, 20, 29, 28, 21, 32, 23),
sexta = c(27, 21, 26, 16, 29, 28, 19, 30, 29, 25, 30, 24),
sabado = c(26, 22, 27, 15, 28, 26, 18, 28, 27, 26, 29, 25),
domingo = c(25, 23, 28, 14, 27, 25, 17, 27, 26, 27, 28, 26)
)Escreva uma função chamada
calcula_media_temperaturas()que receba o data.frametemperaturas_cidadese devolva um vetor com a temperatura média semanal de cada cidade.Crie um vetor chamado
classificacao, utilizando um ciclowhile, que percorra as médias semanais e, com base numa comparação com o valor de referência de 25ºC, classifique cada cidade como:
- “Acima de 25ºC” se a média for maior que 25
- “Abaixo de 25ºC” caso contrário
- Adicione os vetores
media_semanaleclassificacaocomo novas colunas no data.frametemperaturas_cidades.
8. Os computadores podem sofrer alterações aleatórias em bits da memória (bit flips) devido à ação de partículas de alta energia, como os raios gama. Esse fenómeno é estudado em contextos críticos como aviação, medicina, criptografia e computação de alto desempenho.
Um engenheiro está a simular o impacto de radiação em blocos de memória RAM, com o objetivo de identificar quais blocos foram mais afetados por possíveis bit flips.
Considere a seguinte simulação:
set.seed(2025)
# Vetor que representa o estado original de 1000 bits (0 ou 1)
original <- sample(c(0,1), size = 1000, replace = TRUE)
# Vetor que representa o estado final após exposição à radiação (raios gama)
# Cada bit tem 3% de probabilidade de ser alterado (flipado)
flipado <- ifelse(runif(1000) < 0.03, 1 - original, original)
# Divisão dos bits em blocos de memória (100 bits por bloco)
blocos <- rep(1:10, each = 100)Crie um vetor
errosque contenha o número de bits alterados (bit flips), comparando original comflipado.Crie um fator chamado
bloco_memoriacom os valores de 1 a 10, indicando o bloco de cada bit, como já feito na variávelblocos.Calcule o número de bit flips em cada bloco de memória.