Nesta aula, vamos explorar como acessar e manipular linhas e colunas de data frames usando tanto o R Base quanto o tidyverse. Um data frame é uma das estruturas de dados mais importantes no R, permitindo a manipulação de dados tabulares com diferentes tipos de variáveis.
Criando um Data Frame no R
Vamos começar criando um data frame básico para usar em nossos exemplos:
Usando Colchetes ([]) para Acessar Linhas e Colunas de um Data Frame no R
No R, os colchetes ([]) são uma ferramenta poderosa e flexível para acessar elementos específicos dentro de um data frame. Um data frame é essencialmente uma tabela composta por linhas e colunas, e o uso de colchetes permite que você selecione partes dessa tabela de acordo com suas necessidades.
Estrutura Básica dos Colchetes
A forma básica de utilizar os colchetes para acessar elementos de um data frame é:
data_frame[linhas, colunas]
linhas: Refere-se ao(s) índice(s) da(s) linha(s) que você deseja acessar.
colunas: Refere-se ao(s) índice(s) da(s) coluna(s) que você deseja acessar.
Se você omitir a parte referente às linhas ou colunas, todos os elementos dessa dimensão serão selecionados.
Acessando Linhas pelos índices
Para acessar uma linha específica, você deve especificar o índice da linha e omitir a parte referente às colunas:
Code
# Código para mostrar as linhas 1 do data framedf[1, ]
ID nome sexo idade peso altura salario departamento
1 1 Ana 0 23 65 1.65 5000 Vendas
Este comando retorna a primeira linha do data frame df, incluindo todas as colunas.
Se você quiser acessar várias linhas em sequencia, pode especificar um intervalo de índices:
Code
# Código para mostrar as linhas 2 a 5 do data framedf[2:5, ]
ID nome sexo idade peso altura salario departamento
2 2 Carlos 1 35 85 1.78 7000 Vendas
3 3 Flávio 1 35 85 1.78 7000 Vendas
4 4 Bruno 1 40 78 1.75 6500 RH
5 5 Daniel 1 32 90 1.80 6000 RH
Se você quiser acessar várias não sequenciais, pode criar um conjunto com os índices:
Code
# Código para mostrar as linhas 2, 5 e 7 do data frame# Para isso usamos a função c para criar um conjunto com as linhas de interessedf[c(2,5,7), ]
ID nome sexo idade peso altura salario departamento
2 2 Carlos 1 35 85 1.78 7000 Vendas
5 5 Daniel 1 32 90 1.80 6000 RH
7 7 João 0 32 58 1.60 6800 TI
Filtrando Linhas com Base em Condições
Você também pode usar condições lógicas para filtrar linhas ao acessar um data frame. Neste exemplo, estamos selecionando todas as linhas onde a coluna idade tem um valor maior que 25.
Code
df[df$idade >25, ]
ID nome sexo idade peso altura salario departamento
2 2 Carlos 1 35 85 1.78 7000 Vendas
3 3 Flávio 1 35 85 1.78 7000 Vendas
4 4 Bruno 1 40 78 1.75 6500 RH
5 5 Daniel 1 32 90 1.80 6000 RH
6 6 Fernando 1 28 88 1.82 7200 Administração
7 7 João 0 32 58 1.60 6800 TI
8 8 Gustavo 1 45 82 1.77 7100 TI
9 9 Helena 0 30 62 1.68 7500 TI
10 10 Isabela 0 45 70 1.72 8000 Administração
11 11 Antônio 1 58 95 1.85 1000 RH
Podemos também filtrar linhas com a função subset()
Code
df |>subset(idade >25)
ID nome sexo idade peso altura salario departamento
2 2 Carlos 1 35 85 1.78 7000 Vendas
3 3 Flávio 1 35 85 1.78 7000 Vendas
4 4 Bruno 1 40 78 1.75 6500 RH
5 5 Daniel 1 32 90 1.80 6000 RH
6 6 Fernando 1 28 88 1.82 7200 Administração
7 7 João 0 32 58 1.60 6800 TI
8 8 Gustavo 1 45 82 1.77 7100 TI
9 9 Helena 0 30 62 1.68 7500 TI
10 10 Isabela 0 45 70 1.72 8000 Administração
11 11 Antônio 1 58 95 1.85 1000 RH
Acessando Colunas pelos índices
Podemos acessar colunas específica por seus índices (posição).
Code
# Acessando a coluna 2 do data frame (coluna dos nomes)df[, 2]
Neste exemplo, estamos acessando a segunda coluna do data frame df. A omissão de qualquer valor antes da vírgula ([ , 2]) indica que todas as linhas devem ser selecionadas.
Podemos acessar também mais de uma coluna da mesma forma que fizemos com as linhas
Code
# Acessando a coluna 2 e 5 do data frame (coluna dos nomes)df[, c(2,5)]
nome peso
1 Ana 65
2 Carlos 85
3 Flávio 85
4 Bruno 78
5 Daniel 90
6 Fernando 88
7 João 58
8 Gustavo 82
9 Helena 62
10 Isabela 70
11 Antônio 95
Acessando Colunas pelo nome
O uso de índices para acessar colunas de um data frame no R pode ser arriscado, especialmente ao criar novas variáveis, porque a posição das colunas pode mudar durante a manipulação dos dados ou com a adição de novas colunas. Se você criar uma nova variável baseada em um índice específico, como df[, 2], e posteriormente reorganizar ou modificar o data frame, o índice 2 pode não mais se referir à coluna desejada, levando a resultados incorretos ou inesperados. Esse risco é particularmente elevado em projetos colaborativos ou quando o código é executado em diferentes versões do data frame, onde a estrutura do data frame pode ter mudado. Portanto, é recomendável usar os nomes das colunas em vez de índices para garantir que o código seja mais robusto e menos propenso a erros.
Você pode acessar uma coluna específica usando seu nome entre aspas
Podemos também acessar uma coluna da seguinte forma: df["nome"]
Code
df["nome"]
nome
1 Ana
2 Carlos
3 Flávio
4 Bruno
5 Daniel
6 Fernando
7 João
8 Gustavo
9 Helena
10 Isabela
11 Antônio
Veja que nesse caso, isso retornará um novo data frame com apenas a coluna chamada Nome. Se você quiser retornar a coluna como um vetor, use df[, "Nome"].
Acessando Células
Para acessar um elemento específico (uma célula) dentro do data frame, você deve especificar tanto a linha quanto a coluna:
Code
df[1, 2]
[1] "Ana"
Isso retornará o valor localizado na primeira linha e na segunda coluna de df.
Usando $ para Acessar Colunas
Usar df$nome_da_coluna para acessar uma coluna de um data frame no R é geralmente mais indicado do que usar df["nome_da_coluna"] por algumas razões principais:
Legibilidade e Sintaxe Simplificada: O operador $ é mais conciso e frequentemente mais legível, especialmente em códigos longos ou quando se trabalha com muitas colunas. A sintaxe df$nome é intuitiva e fácil de entender, destacando claramente que você está acessando uma coluna específica do data frame.
Retorno como Vetor: Quando você usa df$nome, o resultado é um vetor, o que pode ser mais conveniente em muitas operações, especialmente quando você deseja aplicar funções diretamente à coluna ou realizar cálculos. Por outro lado, df["nome"] retorna um data frame com uma única coluna, o que pode exigir passos adicionais para conversão em vetor se necessário.
Compatibilidade com Operações Comuns: O operador $ é amplamente suportado em diversas funções e operações no R. Ele facilita o acesso e a manipulação direta dos dados dentro da coluna, o que pode tornar o código mais eficiente e menos suscetível a erros.
Em resumo, df$nome é preferido por sua simplicidade, facilidade de leitura e por retornar um vetor diretamente, o que é mais útil em muitas operações comuns no R.
Code
df$idade
[1] 23 35 35 40 32 28 32 45 30 45 58
Embora o uso de df$nome tenha várias vantagens, há algumas desvantagens a serem consideradas:
Não Funciona com Nomes de Colunas Dinâmicos: Uma das principais limitações do operador $ é que ele não pode ser usado quando o nome da coluna é armazenado em uma variável. Por exemplo, se você tem o nome de uma coluna armazenado em uma variável coluna, não pode acessar a coluna como df$coluna; em vez disso, precisa usar df[[coluna]] ou df[, coluna].
Code
# Nome da coluna armazenado em uma variável chamada yy <-"idade"# Tentando acessar a coluna usando $# Isso NÃO vai funcionar corretamentedf$y # Retorna NULL, pois 'y' não é um nome de coluna no data frame df
NULL
Code
# Forma correta usando [[ ]] ou [, ]df[[y]] # Retorna o vetor c(23, 35, 28)
[1] 23 35 35 40 32 28 32 45 30 45 58
Nomes de Colunas Não Padrão: O operador $ não funciona bem com nomes de colunas que contêm caracteres especiais, espaços ou que começam com números. Se a coluna tem um nome como “idade do paciente”, o uso de df$"idade do paciente" pode ser problemático e exigir soluções alternativas, como df[["idade do paciente"]].
Code
# Criando um data frame com um nome de coluna não padrãodf2 <-data.frame("nome"=c("Antônio", "Bruna", "Carlos"),"idade do paciente"=c(23, 35, 28),check.names =FALSE)# Tentando acessar a coluna com um espaço no nome usando $# Isso pode até funcionar as vezes, mas definitivamente NÃO DEVE SER USADO NUNCAdf2$"idade do paciente"
[1] 23 35 28
Code
# Forma correta usando [["idade do paciente"]]df2[["idade do paciente"]] # Retorna o vetor c(23, 35, 28)
[1] 23 35 28
Ambiguidade em Casos Específicos: Se o nome da coluna for o mesmo que o nome de uma função ou de um objeto existente no ambiente, o uso de $ pode levar a ambiguidades ou erros. Por exemplo, se você tiver uma função chamada sum e também uma coluna sum, df$sum pode não se comportar como esperado.
Não Retorna um Data Frame: df$nome retorna um vetor, não um data frame, o que pode ser uma desvantagem se você precisar manter a estrutura do data frame. Em casos onde é necessário preservar o formato de data frame, df["nome"] seria mais apropriado.
Essas desvantagens são contextuais e podem ou não ser relevantes dependendo da natureza do seu trabalho com dados. No entanto, é importante estar ciente dessas limitações ao escolher entre df$nome e outras formas de acessar colunas em um data frame.
Acesso a Data Frames com o tidyverse
O tidyverse oferece uma sintaxe mais legível e funcional para acessar e manipular data frames. Vamos explorar algumas funções chave.
Usando select() para Acessar Colunas
A função select() é usada para escolher colunas de forma clara e direta, podemos incluir todas as colunas de interesse separadas por vírgulas.
Code
library(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
Code
df |>select(nome, idade)
nome idade
1 Ana 23
2 Carlos 35
3 Flávio 35
4 Bruno 40
5 Daniel 32
6 Fernando 28
7 João 32
8 Gustavo 45
9 Helena 30
10 Isabela 45
11 Antônio 58
Usando filter() para Acessar Linhas
A função filter() permite acessar linhas com base em condições específicas:
Code
library(dplyr)df |>filter(idade >25)
ID nome sexo idade peso altura salario departamento
1 2 Carlos 1 35 85 1.78 7000 Vendas
2 3 Flávio 1 35 85 1.78 7000 Vendas
3 4 Bruno 1 40 78 1.75 6500 RH
4 5 Daniel 1 32 90 1.80 6000 RH
5 6 Fernando 1 28 88 1.82 7200 Administração
6 7 João 0 32 58 1.60 6800 TI
7 8 Gustavo 1 45 82 1.77 7100 TI
8 9 Helena 0 30 62 1.68 7500 TI
9 10 Isabela 0 45 70 1.72 8000 Administração
10 11 Antônio 1 58 95 1.85 1000 RH
Usando mutate() para Criar ou Modificar Colunas
A função mutate() é útil para criar novas colunas ou modificar as existentes:
Code
# Criando a variável salário anual e a variável IMCdf |>mutate(salario_anual = salario*13, imc = peso/altura^2)
A função pull() extrai uma coluna de um data frame como um vetor:
Code
df |>pull(idade)
[1] 23 35 35 40 32 28 32 45 30 45 58
Comparação entre R Base e tidyverse
R Base
Vantagens: - Já está disponível por padrão no R. - Flexível para diferentes tipos de operações.
Desvantagens: - Sintaxe pode ser menos legível e intuitiva para iniciantes.
tidyverse
Vantagens: - Sintaxe intuitiva e legível. - Integração fácil entre diferentes funções.
Desvantagens: - Requer a instalação e carregamento de pacotes adicionais. - Pode ser mais lento para operações muito grandes em comparação com funções vetorizadas do R Base.
Conclusão
Neste documento, exploramos várias formas de acessar e manipular linhas e colunas de data frames usando tanto o R Base quanto o tidyverse. Ambas as abordagens têm suas vantagens e desvantagens, e a escolha entre elas depende das suas necessidades específicas e do contexto da análise de dados.