R: Operadores R
Última atualização: 2026-08-26
Na aula anterior, aprendemos sobre vetores e tipos de dados. Nesta aula, vamos nos aprofundar nos “fundamentos” da programação em R — os operadores. Todos os programas em R — desde cálculos simples até modelos estatísticos complexos — são movidos, em sua essência, por operadores.
O conjunto de operadores do R é praticamente o mesmo que o de outras linguagens, mas há dois pequenos detalhes exclusivos do R: a divisão inteira %% %/% e o comportamento vetorizado de “broadcasting”. Nesta aula, abordaremos detalhadamente todos os operadores.
1. O que você vai aprender
- 4 categorias principais de operadores aritméticos (operações básicas + divisão de inteiros + operações vetoriais)
- 3 tipos de operadores de comparação (comparação numérica + comparação de cadeias de caracteres + valores especiais)
- 3 tipos de operadores lógicos (AND, OR, NOT + avaliação de curto-circuito)
- 5 operadores R exclusivos (
%in%%*%%/%%%:) - Precedência dos operadores (como evitar expressões ambíguas)
- Armadilhas computacionais comuns em aplicações do mundo real
2. Uma história sobre um cálculo financeiro
(1) Desafio: Cálculo manual dos lucros
Bob é contador e, no final do mês, precisa preparar o “relatório de vendas da filial” para seu gerente:
A empresa possui 5 filiais, e as vendas deste mês de cada uma delas são de
120, 150, 80, 200, 175dez mil yuans. Calcule:
- Vendas totais, Vendas médias
- Lucro por loja (vendas × margem de lucro de 30%)
- Quais lojas apresentam vendas acima da média (requerem atenção especial)
- A parte inteira do lucro total (em 10.000 yuans, arredondada para baixo)
Se você fizer o cálculo manualmente com uma calculadora, leva 5 minutos; com o Excel, é preciso criar uma planilha e inserir fórmulas; com o R—
(2) Solução usando R
# 5 Sales at each branch(10,000 yuan)
sales <- c(120, 150, 80, 200, 175)
# All calculations are completed with a single line of code
total_sales <- sum(sales) # Total Sales 725
avg_sales <- mean(sales) # Average 145
profit <- sales * 0.3 # Profit Vector
high_sales <- sales[sales > avg_sales] # Branches with Above-Average Performance
profit_int <- profit %/% 1 # Integer Profit(Integer Division)
cat("Total Sales:", total_sales, "10,000 yuan\n")
cat("Average Sales:", avg_sales, "10,000 yuan\n")
cat("Total Profit(Integer):", sum(profit_int), "10,000 yuan\n")
cat("Above-average sales at branch locations:", high_sales, "\n")
10 linhas de código para resolver 5 tarefas computacionais. Esse é o poder do operador R — uma única linha de código equivale a um vetor de operações.
3. Operadores aritméticos: cálculos matemáticos
(1) Operadores aritméticos básicos
| Operador | Significado | Exemplo | Resultado |
|---|---|---|---|
+ |
Adicionar | 2 + 3 |
5 |
- |
Diminuir | 5 - 2 |
3 |
* |
Multiplicar | 4 * 3 |
12 |
/ |
Remover | 7 / 2 |
3.5 |
^ ou ** |
Alimentação | 2 ^ 3 |
8 |
%% |
Subtração (Resto) | 7 %% 2 |
1 |
%/% |
Divisão inteira | 7 %/% 2 |
3 |
(2) Divisão de inteiros: específica do R
# 7 / 2 = 3.5(Ordinary Division)
7 / 2
# [1] 3.5
# 7 %/% 2 = 3(Integer Division,Round down)
7 %/% 2
# [1] 3
# 7 %% 2 = 1 (Modulo, Remainder)
7 %% 2
# [1] 1
# Practical Application: Convert seconds to "hr:min:s"
total_seconds <- 3725
hours <- total_seconds %/% 3600
minutes <- (total_seconds %% 3600) %/% 60
seconds <- total_seconds %% 60
cat(hours, "hr", minutes, "min", seconds, "s\n")
# 1 hr 2 min 5 s
%% e %/% são extremamente comuns no processamento de dados: paginação (page %/% page_size), agrupamento (id %% 10 — divisão em 10 grupos com base no último dígito) e conversão de horário.
(3) Operações com vetores (Ponto-chave)
As operações aritméticas no R são vetorizadas por padrão — esse é um dos principais pontos fortes do R:
graph LR
A["x = 1, 2, 3"] --> C["+ 10"]
C --> D["11, 12, 13"]
E["x = 1, 2, 3"] --> F["+ y = 10, 20, 30"]
F --> G["11, 22, 33"]
style A fill:#cce5ff
style C fill:#d4edda
style D fill:#d4edda
# Vector + Scalar(Scalar"Broadcast"Go to each element)
c(1, 2, 3) + 10
# [1] 11 12 13
# Vector + Vector(Element-wise Operations)
c(1, 2, 3) + c(10, 20, 30)
# [1] 11 22 33
# When the lengths are different,"Loop"
c(1, 2, 3, 4) + c(10, 20)
# Warning: longer object length is not a multiple of shorter object length
# [1] 11 22 13 24
(4) Funções matemáticas comuns
| Função | Finalidade | Exemplo |
|---|---|---|
abs() |
valor absoluto | abs(-5) → 5 |
sqrt() |
raiz quadrada | sqrt(16) → 4 |
| Logaritmo natural | → | |
log10() |
Logaritmo comum | log10(1000) → 3 |
log2() |
Base 2 | log2(8) → 3 |
exp() |
x elevado a e | exp(1) → 2.718 |
| Resumo | round() |
|
floor() |
Arredondar para baixo | floor(3.7) → 3 |
| Resumo | ceiling() |
ceiling(3.2) → 4 |
4. Operadores de comparação: avaliação de verdadeiro/falso
(1) 6 Operadores de comparação
| Operador | Significado | Exemplo | Resultado |
|---|---|---|---|
== |
é igual a | 5 == 5 |
TRUE |
!= |
Diferente de | 5 != 3 |
TRUE |
< |
Menor que | 3 < 5 |
TRUE |
> |
Maior que | 5 > 3 |
TRUE |
<= |
Menor ou igual a | 5 <= 5 |
TRUE |
>= |
Maior ou igual a | 5 >= 6 |
FALSE |
(2) ⚠️ Armadilha importante: sinal de igual simples x dois sinais de igual
# Single = It is an assignment
x = 5
# Double equal sign == It is a comparison
x == 5
# [1] TRUE
==; não use =. O R não exibirá um erro “=`” (já que se trata de uma atribuição válida), mas o resultado será completamente incorreto.
(3) Comparação de cadeias de caracteres (ordem lexicográfica)
# Character by ASCII Code Comparison
"apple" < "banana"
# [1] TRUE ← 'a' Coding < 'b'
# Numeric characters cannot be compared directly for size.(Character-by-character comparison,Not by value)
"9" > "10"
# [1] TRUE <- '9' (0x39) > '1' (0x31), Not a numerical comparison!
# The Correct Way to Do It:Convert to a number
as.numeric("9") > as.numeric("10")
# [1] FALSE
(4) Comparando valores especiais
# NA The results of the comparison are NA(No TRUE/FALSE)
NA == 5
# [1] NA
# Decision NA Must use is.na()
is.na(NA)
# [1] TRUE
# NaN Comparison of
NaN == NaN
# [1] NA <- NaN == NaN is also NA!
is.na() especificamente para verificar isso.
5. Operadores lógicos: combinando condições
(1) Os três operadores lógicos básicos
| Operador | Significado | Exemplo | Resultado |
|---|---|---|---|
& |
AND elemento a elemento | TRUE & FALSE |
FALSE |
| |
OR elemento a elemento | TRUE | FALSE |
TRUE |
! |
Cancelar | !TRUE |
FALSE |
(2) Vetorização (Ponto-chave)
x <- c(TRUE, TRUE, FALSE, FALSE)
y <- c(TRUE, FALSE, TRUE, FALSE)
# Elemental Level AND(Vectorization)
x & y
# [1] TRUE FALSE FALSE FALSE
# Elemental Level OR
x | y
# [1] TRUE TRUE TRUE FALSE
(3) Avaliação em curto-circuito: && e ||
| Operador | Comportamento | Finalidade |
|---|---|---|
& |
Operador AND elemento a elemento, todos os cálculos | Operações lógicas vetoriais |
&& |
AND de curto-circuito, apenas o primeiro valor é considerado | condição if |
| |
OR elemento a elemento, todos os cálculos | Operações lógicas vetoriais |
|| |
OR de curto-circuito, apenas o primeiro conta | condição if |
# if Used in the conditions &&(Check only the first element)
if (x > 0 && x < 10) {
cat("x is between 0-10\n")
}
# Used in vector logic &(Check all elements)
c(1, 2, 11) > 0 & c(1, 2, 11) < 10
# [1] TRUE TRUE FALSE
if, você deve usar && e ||; não use & nem |. Caso contrário, você poderá obter resultados inesperados.
(4) Prática: Filtragem com condições combinadas
# Find 18-30 Adults aged
ages <- c(15, 22, 28, 35, 40, 19)
adults <- ages[ages >= 18 & ages <= 30]
adults
# [1] 22 28 19
# Identify the failing or perfect scores
scores <- c(58, 60, 75, 100, 45, 90)
special <- scores[scores < 60 | scores == 100]
special
# [1] 58 100 45
6. Operadores específicos do R
(1) 5 Operadores Especiais
| Operador | Significado | Exemplo | Resultado |
|---|---|---|---|
%in% |
Pertence a (Verificação de membro) | 3 %in% c(1,2,3) |
TRUE |
%*% |
Multiplicação de matrizes | matrix(1:4,2) %*% matrix(1:4,2) |
Matrizes |
%/% |
Divisão inteira | 7 %/% 2 |
3 |
%% |
desmoldagem | 7 %% 2 |
1 |
: |
Sequência | 1:5 |
1 2 3 4 5 |
(2) Uma explicação detalhada sobre %in%
%in% é o operador “principal” para a filtragem de dados:
# Is the element in the vector?
c(1, 2, 3) %in% c(2, 4, 6)
# [1] FALSE TRUE FALSE <- 1, 3 Not here; 2 is
# Practical Application: Filter "Beijing, Shanghai, and Guangzhou" City
cities <- c("Beijing", "Shanghai", "Shenzhen", "Guangzhou", "Hangzhou")
target <- c("Beijing", "Shanghai", "Guangzhou")
cities[cities %in% target]
# [1] "Beijing" "Shanghai" "Guangzhou"
(3) Introdução à multiplicação de matrizes %*%
# Basic Multiplication(Elemental Level)
matrix(1:4, 2, 2) * matrix(1:4, 2, 2)
# [,1] [,2]
# [1,] 1 9
# [2,] 4 16
# Matrix Multiplication(Linear Algebra)
matrix(1:4, 2, 2) %*% matrix(1:4, 2, 2)
# [,1] [,2]
# [1,] 7 15
# [2,] 10 22
7. Precedência dos operadores (como evitar ambiguidades)
Os operadores no R têm uma ordem de precedência específica; usar parênteses em caso de dúvida é a abordagem mais segura:
| Prioridade | Operador | Descrição |
|---|---|---|
| Alta | ^ |
Operações de energia |
| ↑ | * / |
Multiplicação e divisão |
| ↑ | + - |
Adição e subtração |
| ↑ | < <= > >= == != |
Comparar |
| ↑ | ! |
Desfazer |
| ↑ | & && |
Com |
| ou | ||
| Baixo | <- |
Tarefa |
# Without parentheses(By priority)
1 + 2 * 3
# [1] 7 <- 2*3=6, then +1
# Add parentheses(Clarify Intent)
(1 + 2) * 3
# [1] 9
# Be sure to use parentheses in complex expressions.
# Find 18-65 yrs
ages <- c(15, 25, 70, 30)
adults <- ages[ages >= 18 & ages <= 65] # ✅ Adding parentheses makes it clearer
8. Exemplo completo: Análise abrangente das vendas das filiais
A seguir, apresentamos um exemplo de um fluxo de trabalho completo que combina todos os operadores abordados nesta lição.
▶ Exemplo: Análise abrangente das vendas das filiais
# ============================================
# Comprehensive Analysis of Branch Sales
# Features:Analysis Using Various Operators 5 Sales Data by Branch
# ============================================
# 1. Prepare data
sales <- c(Beijing = 120, Shanghai = 150, Shenzhen = 80, Guangzhou = 200, Hangzhou = 175)
cat("Raw Sales Data(10,000 yuan):\n")
print(sales)
# 2. Arithmetic Operations:Total Sales,Average,Highest,Lowest
total <- sum(sales) # Sum
avg <- mean(sales) # Average
cat("\nTotal Sales:", total, "10,000 yuan\n")
cat("Average Sales:", avg, "10,000 yuan\n")
cat("Top Sales:", max(sales), "10,000 yuan\n")
cat("Minimum Sales:", min(sales), "10,000 yuan\n")
# 3. Arithmetic Operations:Profit(30% Profit Margin)
profit_rate <- 0.3
profit <- sales * profit_rate # Vector × Scalar
cat("\nTotal Profit:", sum(profit), "10,000 yuan\n")
# 4. Comparison + Logic:Identify branches that perform above average
is_above_avg <- sales > avg # Comparison:Which ones are above average?
cat("\nBranches with Above-Average Performance:")
print(sales[is_above_avg])
# 5. Comparison + Logic:Identify low-performing stores(< 1,000,000)
is_low <- sales < 100
cat("\nLow-Sales Stores(< 1,000,000):")
print(sales[is_low])
# 6. Integer Operations:Round Profit to the Nearest Whole Number + Grouping
profit_int <- profit %/% 1 # Integer Division(Round down)
cat("\nRound Profit to the Nearest Whole Number:")
print(profit_int)
# 7. %in% Filter
target_cities <- c("Beijing", "Shanghai", "Guangzhou")
selected <- sales[names(sales) %in% target_cities]
cat("\nSales in Target Cities:")
print(selected)
Resultado esperado (trecho):
Raw Sales Data(10,000 yuan):
Beijing Shanghai Shenzhen Guangzhou Hangzhou
120 150 80 200 175
Total Sales: 725 10,000 yuan
Average Sales: 145 10,000 yuan
Top Sales: 200 10,000 yuan
Minimum Sales: 80 10,000 yuan
Branches with Above-Average Performance:
Guangzhou Hangzhou
200 175
Total Profit: 217.5 10,000 yuan
Low-Sales Stores(< 1,000,000):
Shenzhen
80
❓ Perguntas Frequentes
P: Qual é a diferença entre
%%e%/%? R:%%realiza divisão modular (retorna o resto), enquanto%/%realiza divisão inteira (retorna o quociente). Por exemplo,7 %/% 2 = 3(quociente) e7 %% 2 = 1(restante). Essas funções são extremamente comuns em cenários de paginação, conversão de horário e agrupamento.
P: Qual é a diferença entre
x = 5ex == 5? R:x = 5é uma atribuição (atribuir 5 a x), enquantox == 5é uma comparação (verificar se x é igual a 5). Ao escrever uma comparação, você deve usar==; não é possível usar=. Caso contrário, ela se tornará uma atribuição, e o resultado será completamente diferente.
P: A que é igual
NA == 5? R: É igual aNA, e não aTRUEnem aFALSE. Qualquer resultado de comparação que contenha NA é NA. Para verificar se há NA, é preciso usar a funçãois.na().
P: Qual devo usar,
&ou&&? R: Use¶ operações lógicas vetoriais (vetorizadas, avaliam todos os elementos); use&¶ condiçõesif(avaliação em curto-circuito, avalia apenas o primeiro elemento). O R não faz uma distinção tão rígida entre eles quanto outras linguagens, mas usar o elemento errado pode levar a instruçõesifincorretas.
P: Como uso
%in%? R:%in%é o operador “pertence a”, que retorna um vetor lógico. Por exemplo,3 %in% c(1,2,3)retornaTRUE. É extremamente comum na filtragem de dados:df$city %in% c("Beijing", "Shanghai")seleciona cidades no norte e no leste.
📖 Resumo
- 4 categorias principais de operadores: aritméticos (
+ - * / ^ %% %/%), de comparação (== != < > <= >=), lógicos (& \| !) e de atribuição (<- = -> <<-) - Recursos do R: Divisão de inteiros
%%%/%, comportamento vetorizado de “broadcasting”, verificação de membros%in% - Vetor + escalar = o escalar é aplicado a cada elemento; vetor + vetor = operação elemento a elemento
- As cadeias de caracteres são comparadas com base em sua codificação ASCII (e não em seus valores numéricos); os caracteres numéricos devem ser convertidos usando
as.numeric(). ifpara operações condicionais&&\|\|(avaliação por curto-circuito) e&\|para lógica vetorial (vetorização)- Os operadores têm precedência; se você tiver dúvidas, use parênteses (legibilidade > concisão)
NA == 5O resultado éNA(não TRUE/FALSE); useis.na()para avaliá-lo
📝 Exercícios
-
Problema básico: Use o R para calcular 1+2+3+...+100 utilizando três métodos diferentes: ①
sum(1:100)② um loop ③ uma fórmulan(n+1)/2. Verifique se os resultados dos três métodos coincidem. -
Exercício básico: Converta o número de segundos
total_seconds <- 3725para o formato “horas:minutos:segundos” (consulte o exemplo de divisão inteira nesta lição) e salve uma captura de tela do código e do resultado. -
Problema básico: Use
%in%para encontrar os números pares no vetorc(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)(usando o método descrito parac(2, 4, 6, 8, 10) %in%) e faça uma captura de tela do resultado. -
Problema avançado: Calcule as notas de 5 alunos
scores <- c(85, 92, 78, 95, 88)usando operadores de comparação e lógicos para: ① Identificar as notas iguais ou superiores a 90; ② Identificar as notas entre 60 e 89; ③ Contar o número de alunos com notas iguais ou superiores a 80. -
Desafio: Escreva um script que utilize
sample(1:100, 20)para gerar aleatoriamente 20 números e conte: ① quantos são pares (%% 2 == 0); ② quantos são divisíveis por 3 (%% 3 == 0); ③ quantos são pares e divisíveis por 3 (&— condição combinada); ④ a soma e a média desses números.