0Pricing
R Academy · Aula

De formato longo para amplo com pivot_wider()

Transforme pares de chave e valor novamente em tabelas de formato amplo.

De formato longo para amplo com pivot_wider() é uma aula grátis de R Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de R Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de R Academy inclui 4 aulas no total.

Quando usar o formato largo

Embora o formato longo seja adequado para análises, o formato largo costuma ser necessário para relatórios, planilhas e determinados algoritmos (por exemplo, matrizes de correlação). pivot_wider() é o inverso de pivot_longer() — ele distribui os valores de uma coluna em várias colunas novas.

library(tidyr)

# Long format: one row per student-quarter combination
long_df <- data.frame(
  student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
  quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
  score = c(85, 88, 92, 90, 85, 88)
)

print(long_df)
cat('\n', nrow(long_df), 'rows x', ncol(long_df), 'cols')

Fundamentos de pivot_wider()

pivot_wider(df, names_from, values_from) converte o formato longo em formato largo. names_from especifica a coluna cujos valores se tornarão novos nomes de colunas; values_from especifica a coluna cujos valores preencherão essas novas colunas.

library(tidyr)

long_df <- data.frame(
  student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
  quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
  score = c(85, 88, 92, 90, 85, 88)
)

wide_df <- pivot_wider(
  long_df,
  names_from = quarter,
  values_from = score
)

print(wide_df)

id_cols — Identificar chaves de linha

id_cols especifica quais colunas identificam exclusivamente cada linha na saída em formato largo. Por padrão, o dplyr usa todas as colunas não especificadas em names_from ou values_from. Defini-lo explicitamente evita agrupamentos inesperados.

library(tidyr)

df <- data.frame(
  year = c(2023,2023,2024,2024),
  region = c('East','West','East','West'),
  quarter = c('Q1','Q1','Q1','Q1'),
  revenue = c(100, 200, 120, 220)
)

pivot_wider(
  df,
  id_cols = c(year, quarter),
  names_from = region,
  values_from = revenue
)

values_fill — Tratamento de combinações ausentes

Quando algumas combinações de id_cols e names_from não existem, a célula resultante será NA. Use values_fill para substituir esses valores ausentes por um valor padrão (por exemplo, 0 para contagens ou somas).

library(tidyr)

df <- data.frame(
  product = c('A','A','B'),
  channel = c('online','store','online'),
  sales = c(100, 150, 200)
)

# 'B' has no 'store' data — fill with 0
pivot_wider(
  df,
  names_from = channel,
  values_from = sales,
  values_fill = 0
)

names_prefix — Adição de prefixos

Use names_prefix para acrescentar uma cadeia de caracteres ao início de todos os novos nomes de colunas. Isso evita problemas quando os valores de names_from são números ou quando você deseja tornar os nomes das colunas mais descritivos.

library(tidyr)

df <- data.frame(
  student = c('Alice','Alice','Bob','Bob'),
  quarter = c(1, 2, 1, 2),
  score = c(85, 90, 78, 82)
)

# Without prefix: columns named '1' and '2' (problematic)
# With prefix: q1, q2
pivot_wider(
  df,
  names_from = quarter,
  values_from = score,
  names_prefix = 'q'
)

Múltiplas colunas em values_from

Você pode transformar várias colunas de valores de uma só vez passando um vetor para values_from. As colunas resultantes são nomeadas como value_name, combinando o nome da coluna de valores e a categoria.

library(tidyr)

df <- data.frame(
  region = c('East','East','West','West'),
  period = c('Q1','Q2','Q1','Q2'),
  revenue = c(100, 120, 200, 210),
  units = c(10, 12, 20, 22)
)

pivot_wider(
  df,
  names_from = period,
  values_from = c(revenue, units)
)

Tratamento de duplicatas com values_fn

Se houver vários valores para a mesma combinação de id + name, pivot_wider não saberá qual usar e retornará uma coluna de listas com um aviso. Use values_fn para resolver isso especificando uma função de agregação.

library(tidyr)

# Duplicate rows: Alice has two Q1 scores
df <- data.frame(
  student = c('Alice','Alice','Alice','Bob','Bob'),
  quarter = c('Q1','Q1','Q2','Q1','Q2'),
  score = c(85, 87, 90, 78, 82)
)

# Resolve duplicates by taking the mean
pivot_wider(
  df,
  names_from = quarter,
  values_from = score,
  values_fn = mean
)

values_fn com uma lista nomeada

Passe uma lista nomeada para values_fn para aplicar diferentes funções de agregação a diferentes colunas de valores simultaneamente. Isso é útil ao transformar várias colunas de valores que precisam de diferentes métodos de resumo.

library(tidyr)

df <- data.frame(
  region = c('East','East','West','West'),
  period = c('Q1','Q1','Q1','Q1'),
  revenue = c(100, 120, 200, 210),
  orders = c(10, 12, 20, 22)
)

pivot_wider(
  df,
  names_from = period,
  values_from = c(revenue, orders),
  values_fn = list(revenue = sum, orders = sum)
)

Criação de tabelas de contingência

Uma tabela de contingência (tabulação cruzada) em formato de quadro de dados pode ser criada facilmente com pivot_wider() após a contagem com dplyr::count(). Isso combina o poder dos dois pacotes para a análise de frequências.

library(tidyr)
library(dplyr)

survey <- data.frame(
  dept = c('HR','HR','Eng','Eng','HR','Eng'),
  response = c('Yes','No','Yes','Yes','Yes','No')
)

survey %>%
  count(dept, response) %>%
  pivot_wider(
    names_from = response,
    values_from = n,
    values_fill = 0
  )

Ida e volta: Longo -> Largo -> Longo

Entender a relação inversa entre pivot_longer() e pivot_wider() ajuda a detectar erros. Uma ida e volta (longo->largo->longo) deve retornar os dados originais (exceto pela ordem das linhas e por conversões de tipo).

library(tidyr)

original_long <- data.frame(
  id = c(1,1,2,2),
  key = c('a','b','a','b'),
  value = c(10, 20, 30, 40)
)

# Go wide
wide <- pivot_wider(original_long, names_from=key, values_from=value)
print(wide)

# Go long again
pivot_longer(wide, -id, names_to='key', values_to='value')

Prática: Relatório de notas

Um caso de uso típico: pegar uma tabela longa de notas de testes e reorganizá-la em uma tabela de relatório por aluno e disciplina. Combine com dplyr::arrange() e rename() para produzir um resultado limpo e pronto para apresentação.

library(tidyr)
library(dplyr)

scores <- data.frame(
  student = c('Alice','Alice','Bob','Bob','Carol','Carol'),
  subject = c('Math','Science','Math','Science','Math','Science'),
  score = c(92, 88, 85, 91, 79, 83)
)

scores %>%
  pivot_wider(names_from=subject, values_from=score) %>%
  mutate(average = round((Math + Science) / 2, 1)) %>%
  arrange(desc(average))

Verificação rápida

O que acontece quando você chama pivot_wider() e há vários valores para a mesma combinação de id + name?

Recapitulação: pivot_wider()

Principais aprendizados sobre a conversão de longo para largo:

  • pivot_wider(names_from, values_from) transforma uma coluna de chaves em várias colunas novas
  • id_cols especifica quais colunas identificam cada linha
  • values_fill = 0 (ou qualquer valor escalar) preenche combinações ausentes
  • names_prefix acrescenta uma cadeia de caracteres ao início para evitar nomes de colunas numéricos ou ambíguos
  • values_fn resolve valores duplicados em células com uma função de agregação
  • Passe um vetor para values_from para transformar várias colunas de valores simultaneamente
  • Use após count() para criar tabelas de contingência com eficiência
library(tidyr)
library(dplyr)

data.frame(
  region = c('East','East','West','West'),
  metric = c('revenue','units','revenue','units'),
  value = c(100, 10, 200, 20)
) %>%
  pivot_wider(
    names_from = metric,
    values_from = value,
    values_fill = 0
  ) %>%
  mutate(revenue_per_unit = revenue / units)

Perguntas Frequentes

A aula “De formato longo para amplo com pivot_wider()” é grátis?

Sim — o texto completo de “De formato longo para amplo com pivot_wider()” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de R Academy, atualize para CoddyKit PRO. O curso de R Academy inclui 4 aulas no total.

O que vou aprender em “De formato longo para amplo com pivot_wider()”?

Transforme pares de chave e valor novamente em tabelas de formato amplo. Você pratica R Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar R Academy?

Nenhuma experiência prévia é necessária. R Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “De formato longo para amplo com pivot_wider()”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de R Academy?

Sim. Cada aula de R Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. De formato amplo para longo com pivot_longer()
  2. De formato longo para amplo com pivot_wider()
  3. separate() e unite() para colunas de strings
  4. Aninhando e desaninhando quadros de dados
← Voltar para R Academy