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



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, 175 dez 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

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

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
💡 Dica: A divisão inteira %% 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:

100%
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
R
# 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

R
# Single = It is an assignment
x = 5

# Double equal sign == It is a comparison
x == 5
# [1] TRUE
⚠️ Observação: Ao fazer comparações, você deve usar ==; 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)

R
# 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

R
# 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!
⚠️ Observação: Qualquer resultado de comparação que contenha NA é NA. Use 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)

R
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
R
# 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
⚠️ Observação: Na condição 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

R
# 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:

R
# 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 %*%

R
# 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
R
# 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
💡 Dica: Se você estiver em dúvida, coloque entre parênteses. O código é feito para ser lido por pessoas — legibilidade > concisão.



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

R
# ============================================
# 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)
▶ Experimente

Resultado esperado (trecho):

TEXT 📖 Somente leitura
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) e 7 %% 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 = 5 e x == 5? R: x = 5 é uma atribuição (atribuir 5 a x), enquanto x == 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 a NA, e não a TRUE nem a FALSE. Qualquer resultado de comparação que contenha NA é NA. Para verificar se há NA, é preciso usar a função is.na().

P: Qual devo usar, & ou &&? R: Use & para operações lógicas vetoriais (vetorizadas, avaliam todos os elementos); use && para condições if (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ções if incorretas.

P: Como uso %in%? R: %in% é o operador “pertence a”, que retorna um vetor lógico. Por exemplo, 3 %in% c(1,2,3) retorna TRUE. É extremamente comum na filtragem de dados: df$city %in% c("Beijing", "Shanghai") seleciona cidades no norte e no leste.


📖 Resumo


📝 Exercícios

  1. 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órmula n(n+1)/2. Verifique se os resultados dos três métodos coincidem.

  2. Exercício básico: Converta o número de segundos total_seconds <- 3725 para 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.

  3. Problema básico: Use %in% para encontrar os números pares no vetor c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) (usando o método descrito para c(2, 4, 6, 8, 10) %in%) e faça uma captura de tela do resultado.

  4. 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.

  5. 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.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%