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ãoadiciona uma coluna; a expressão é executada para todas as linhas de uma vez.ifelse(test, yes, no)constrói colunas condicionais; oifsimples 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 <- NULLremove uma coluna;case_when()substitui pirâmides deifelse()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.