Menu

Adicionar e Transformar Colunas no R (mutate e R Base)

Como adicionar, transformar e remover colunas de data frames: df$new <- ..., ifelse() para colunas condicionais, transform() e o mutate() do dplyr com case_when().

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Adicionando uma Coluna: df$new <- valor

Para adicionar uma coluna no R base, atribua a um nome que ainda não existe. O valor geralmente é calculado a partir de colunas que existem:

Duas coisas aconteceram. orders$total recebeu um vetor completo - price * qty é calculado para todas as linhas de uma vez, porque a aritmética no R é vetorizada. orders$currency recebeu um valor único, que o R reciclou para as quatro linhas. Qualquer outro comprimento é um erro (replacement has 3 rows, data has 4), que é o R protegendo você de uma coluna desalinhada.

Isso funciona porque um data frame é uma lista de colunas de comprimentos iguais - atribuir um novo elemento nomeado faz a lista crescer. A documentação de data frames destrincha esse modelo.

Colunas Condicionais: ifelse()

Uma coluna cujo valor depende de uma condição pede ifelse() - o primo vetorizado do if. Ele recebe um vetor inteiro de condições e retorna um valor por linha:

Por que não um if simples? Porque if avalia exatamente um TRUE/FALSE - ao receber uma coluna, ele gera erro (the condition has length > 1). ifelse(test, yes, no) verifica cada elemento e escolhe linha por linha. Para três ou mais resultados, você pode aninhar:

Aninhar em dois níveis é aceitável; três ou mais vira uma pirâmide - esse é exatamente o trabalho para o qual o case_when() do dplyr (abaixo) foi criado. O if/else de valor único em si é coberto na documentação de if-else.

Várias Colunas de Uma Vez: transform()

O transform() do R base adiciona múltiplas colunas em uma única chamada, com nomes de colunas sem prefixo:

Note que transform() retorna um novo data frame - você precisa atribuir o resultado de volta, enquanto df$new <- ... modifica o objeto diretamente. Uma limitação: as expressões dentro de uma mesma chamada de transform() não conseguem enxergar umas às outras, então discount = ifelse(total > 50, ...) falha ali (total ainda não existe). Faça em duas etapas - ou com mutate(), que permite isso.

Modificar vs Criar

A mesma sintaxe de atribuição sobrescreve uma coluna existente - a única diferença é se a coluna já existia:

Vale a pena parar aqui: o R não dá nenhum aviso quando você sobrescreve uma coluna. Um erro de digitação como df$prise <- round(df$price, 2) silenciosamente cria uma coluna nova em vez de corrigir a antiga. Depois de uma transformação, use print() ou str() no data frame e confirme que você mudou o que pretendia.

Removendo uma Coluna

Atribua NULL para excluir:

A coluna se foi, sem cerimônia. Para remover várias, df[, c("a", "b")] (mantenha o que você lista) costuma ser mais claro do que NULLs repetidos.

O Jeito dplyr: mutate()

O verbo do dplyr para tudo isso é mutate(). Os trechos abaixo são estáticos - o sandbox executa apenas R base - mas é assim que as mesmas operações ficam:

library(dplyr)

orders |>
    mutate(
        total    = price * qty,
        big      = total > 50        # can use total, defined one line up
    )

Duas vantagens sobre o R base. Primeiro, colunas definidas no mesmo mutate() podem referenciar umas às outras, em ordem - exatamente o que o transform() recusa. Segundo, os auxiliares condicionais são melhores do que ifelse() aninhado:

students |>
    mutate(
        grade = if_else(score >= 60, "pass", "fail"),
        band  = case_when(
            score >= 85 ~ "high",
            score >= 60 ~ "mid",
            .default    = "low"
        )
    )

if_else() é um ifelse() mais rigoroso (os dois ramos precisam ser do mesmo tipo - o que pega bugs reais). case_when() se lê como uma lista plana de pares condição ~ valor verificados de cima para baixo, com .default como reserva - o substituto legível para a pirâmide de ifelse(). Como todo verbo do dplyr, mutate() retorna um novo data frame; veja a introdução ao dplyr para saber como ele se encadeia com o restante.

O Que Você Leva Daqui

  • df$new <- expressão adiciona uma coluna; a expressão é executada para todas as linhas de uma vez.
  • ifelse(test, yes, no) constrói colunas condicionais; o if simples não consegue.
  • transform() adiciona várias colunas por chamada, mas elas não enxergam umas às outras; mutate() consegue.
  • A mesma atribuição sobrescreve silenciosamente - confira a grafia depois de uma transformação.
  • df$col <- NULL remove uma coluna; case_when() substitui pirâmides de ifelse() aninhado.

A seguir: renomear colunas - names(), o idioma robusto do R base e o rename() do dplyr.

Perguntas frequentes

Como adiciono uma nova coluna a um data frame no R?

Atribua a um nome de coluna que ainda não existe: df$total <- df$price * df$qty. O R cria a coluna na hora. O valor pode ser um valor único (reciclado para todas as linhas) ou um vetor calculado a partir de outras colunas, desde que seu comprimento corresponda ao número de linhas.

Como crio uma coluna condicional no R?

Use o ifelse() vetorizado: df$grade <- ifelse(df$score >= 60, "pass", "fail") verifica todas as linhas de uma vez. Não use um if simples - ele lida com uma única condição, não com uma coluna. Para mais de dois resultados, aninhe chamadas de ifelse() ou use o case_when() do dplyr.

O que o mutate() faz no R?

mutate() é o verbo do dplyr para adicionar ou transformar colunas: df |> mutate(total = price * qty) retorna uma cópia do data frame com a nova coluna. Ele pode definir várias colunas em uma única chamada, e colunas posteriores podem usar as anteriores definidas no mesmo mutate.

Como excluo uma coluna de um data frame no R?

Atribua NULL a ela: df$notes <- NULL remove a coluna no próprio objeto. No dplyr, select(-notes) retorna uma cópia sem ela.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR