0Pricing
R Academy · Aula

De formato amplo para longo com pivot_longer()

Remodele tabelas de formato amplo para o formato longo organizado, adequado para análise.

De formato amplo para longo com pivot_longer() é uma aula grátis de R Academy no CoddyKit. Esta é a aula 1 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.

Formatos de dados largo e longo

Os dados podem ser armazenados no formato largo (uma linha por assunto, várias colunas de valores) ou no formato longo (uma linha por observação, uma coluna para o nome da variável e outra para o valor). Muitos pacotes R de visualização e modelagem esperam o formato longo.

library(tidyr)
library(dplyr)

# Wide format: each quarter is a column
wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

print(wide_df)
cat('\nShape:', nrow(wide_df), 'rows x', ncol(wide_df), 'cols')

Fundamentos de pivot_longer()

pivot_longer(df, cols, names_to, values_to) converte o formato largo em formato longo. cols especifica quais colunas transformar, names_to é a nova coluna para os nomes das colunas antigas e values_to é a nova coluna para os valores.

library(tidyr)

wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

long_df <- pivot_longer(
  wide_df,
  cols = c(q1, q2, q3),
  names_to = 'quarter',
  values_to = 'score'
)

print(long_df)

Selecionar colunas com starts_with()

Em vez de listar as colunas explicitamente, use auxiliares do tidyselect dentro de cols. starts_with('prefix'), ends_with('suffix') e contains('string') são especialmente úteis para transformar de maneira consistente colunas com nomes padronizados.

library(tidyr)

df <- data.frame(
  id = 1:3,
  sales_jan = c(100, 200, 150),
  sales_feb = c(120, 180, 160),
  sales_mar = c(130, 190, 170)
)

# Select all sales_ columns automatically
pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'month',
  values_to = 'sales'
)

Excluir colunas com -col

Outra abordagem é especificar quais colunas excluir da transformação usando -col_name. Todas as outras serão transformadas. Isso é útil quando você tem apenas uma ou duas colunas de ID e muitas colunas de valores.

library(tidyr)

df <- data.frame(
  region = c('East','West'),
  jan = c(100, 200),
  feb = c(110, 210),
  mar = c(120, 220),
  apr = c(130, 230)
)

# Pivot everything except 'region'
pivot_longer(df, cols = -region, names_to = 'month', values_to = 'revenue')

names_prefix — Remover prefixos

Quando os nomes das colunas têm um prefixo como score_q1 e score_q2, o argumento names_prefix remove esse prefixo da coluna names_to resultante. Isso mantém o identificador limpo.

library(tidyr)

df <- data.frame(
  id = 1:3,
  score_q1 = c(85, 90, 78),
  score_q2 = c(88, 85, 80),
  score_q3 = c(92, 88, 84)
)

pivot_longer(
  df,
  cols = starts_with('score_'),
  names_to = 'quarter',
  names_prefix = 'score_',
  values_to = 'score'
)

Transformar vários conjuntos de colunas

Quando você tem vários grupos de colunas de valores (por exemplo, sales_q1 e cost_q1), use names_to com vários valores e names_pattern para dividir os nomes das colunas em partes.

library(tidyr)

df <- data.frame(
  id = 1:2,
  sales_q1 = c(100, 200),
  sales_q2 = c(110, 210),
  cost_q1 = c(60, 110),
  cost_q2 = c(65, 115)
)

pivot_longer(
  df,
  cols = -id,
  names_to = c('.value', 'quarter'),
  names_pattern = '(.+)_(q[0-9]+)'
)

names_transform — Converter tipos

Por padrão, a nova coluna de nomes é do tipo texto. Use names_transform para converter automaticamente a coluna de nomes para outro tipo (por exemplo, o ano inteiro a partir de nomes de colunas como y2020 e y2021).

library(tidyr)

df <- data.frame(
  product = c('A','B'),
  y2021 = c(100, 200),
  y2022 = c(110, 210),
  y2023 = c(120, 220)
)

result <- pivot_longer(
  df,
  cols = -product,
  names_to = 'year',
  names_prefix = 'y',
  names_transform = list(year = as.integer),
  values_to = 'sales'
)

print(result)
cat('year column type:', class(result$year))

values_drop_na — Remover valores ausentes

Quando o formato largo tem valores ausentes para algumas combinações de coluna e linha, eles aparecem como NA no formato longo. Defina values_drop_na = TRUE para remover automaticamente as linhas cujo valor é NA.

library(tidyr)

df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, NA, 78),
  q2 = c(88, 85, NA),
  q3 = c(NA, 88, 84)
)

# Without drop: 9 rows including NAs
pivot_longer(df, -student, names_to='quarter', values_to='score',
             values_drop_na = TRUE)

O formato longo possibilita o ggplot2

O principal motivo para transformar os dados em formato longo é que o ggplot2 associa características estéticas às colunas. Quando todos os valores estão em uma coluna e suas categorias em outra, você pode usar color = quarter ou facet_wrap(~quarter) com facilidade.

library(tidyr)
# (ggplot2 not run here, but showing the data preparation)

df <- data.frame(
  month = c('Jan','Feb','Mar'),
  product_A = c(100, 120, 110),
  product_B = c(200, 190, 210)
)

# After pivoting, ready for ggplot2:
long_df <- pivot_longer(df, -month, names_to='product', values_to='sales')
print(long_df)
# ggplot(long_df, aes(x=month, y=sales, color=product)) + geom_line()

Transformar dados com nomes de colunas numéricos

Às vezes, os nomes das colunas são apenas números (por exemplo, anos: 2020 e 2021). No R, nomes de colunas numéricos aparecem entre aspas nos quadros de dados. Use num_range('', 2020:2023) ou aspas invertidas no argumento cols para tratá-los.

library(tidyr)

# Year columns as numbers (common in census-style data)
df <- data.frame(
  country = c('US','UK'),
  '2021' = c(100, 80),
  '2022' = c(110, 85),
  '2023' = c(120, 90),
  check.names = FALSE
)

pivot_longer(
  df,
  cols = c('2021','2022','2023'),
  names_to = 'year',
  values_to = 'gdp_index'
)

Comparar resultados da transformação

Depois da transformação, valide o resultado: a contagem de linhas deve ser nrow(wide) * n_pivoted_cols, e os valores exclusivos na coluna names_to devem corresponder aos nomes originais das colunas (sem o prefixo, caso ele tenha sido removido).

library(tidyr)

wide <- data.frame(
  id = 1:4,
  jan = c(10,20,30,40),
  feb = c(11,21,31,41),
  mar = c(12,22,32,42)
)

long <- pivot_longer(wide, -id, names_to='month', values_to='value')

cat('Wide rows:', nrow(wide), '\n')
cat('Long rows:', nrow(long), '(expected', nrow(wide)*3, ')\n')
cat('Months:', paste(unique(long$month), collapse=', '), '\n')

Verificação rápida

O que o argumento names_prefix faz em pivot_longer()?

Recapitulação: pivot_longer()

Principais pontos sobre a conversão do formato largo para o longo:

  • pivot_longer(df, cols, names_to, values_to) é a função principal
  • cols aceita seleções do tidyselect: starts_with(), -id_col, c('a','b')
  • names_prefix remove uma sequência inicial dos nomes das colunas
  • names_transform converte o tipo da coluna de nomes (por exemplo, para inteiro)
  • values_drop_na = TRUE remove automaticamente as linhas com NA
  • O formato longo é exigido pelo ggplot2, pela maioria das funções de modelagem e pelos testes estatísticos
  • Valide: linhas no formato longo = linhas no formato largo × número de colunas transformadas
library(tidyr)

df <- data.frame(
  team = c('Alpha','Beta'),
  sales_2022 = c(100, 200),
  sales_2023 = c(120, 220),
  sales_2024 = c(140, 240)
)

pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'year',
  names_prefix = 'sales_',
  names_transform = list(year = as.integer),
  values_to = 'revenue'
)

Perguntas Frequentes

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

Sim — o texto completo de “De formato amplo para longo com pivot_longer()” é 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 amplo para longo com pivot_longer()”?

Remodele tabelas de formato amplo para o formato longo organizado, adequado para análise. 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 1 de 4.

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

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