Lab_03c_Dataframes_acesso

Author

Henrique Alvarenga

Published

11 de setembro de 2024

Acessando Linhas e Colunas em Data Frames no R

Introdução

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:

Code
# Criando um DataFrame com problemas
df <- data.frame(
  ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), 
  nome = c("Ana", "Carlos", "Flávio", "Bruno", "Daniel", "Fernando", "João", "Gustavo", "Helena", "Isabela", "Antônio"),         
  sexo = c(0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1),
  idade = c(23, 35, 35, 40, 32, 28, 32, 45, 30, 45, 58),                        
  peso = c(65, 85, 85, 78, 90, 88, 58, 82, 62, 70, 95),                          
  altura = c(1.65, 1.78, 1.78, 1.75, 1.80, 1.82, 1.60, 1.77, 1.68, 1.72, 1.85),  
  salario = c(5000, 7000, 7000, 6500, 6000, 7200, 6800, 7100, 7500, 8000, 1000),                                                 
  departamento = c("Vendas", "Vendas", "Vendas", "RH", "RH","Administração", "TI", "TI", "TI", "Administração", "RH")      
)

Acesso a Data Frames com o R Base

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 frame
df[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 frame
df[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 interesse
df[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]
 [1] "Ana"      "Carlos"   "Flávio"   "Bruno"    "Daniel"   "Fernando"
 [7] "João"     "Gustavo"  "Helena"   "Isabela"  "Antônio" 

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

Code
# Acessando a coluna dos nomes 
df[, "nome"]
 [1] "Ana"      "Carlos"   "Flávio"   "Bruno"    "Daniel"   "Fernando"
 [7] "João"     "Gustavo"  "Helena"   "Isabela"  "Antônio" 

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:

  1. 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.

  2. 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.

  3. 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:

  1. 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 y
y <- "idade"

# Tentando acessar a coluna usando $
# Isso NÃO vai funcionar corretamente
df$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
  1. 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ão
df2 <- 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 NUNCA
df2$"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
  1. 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.

  2. 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 IMC
df |> mutate(salario_anual = salario*13, 
             imc = peso/altura^2)
   ID     nome sexo idade peso altura salario  departamento salario_anual
1   1      Ana    0    23   65   1.65    5000        Vendas         65000
2   2   Carlos    1    35   85   1.78    7000        Vendas         91000
3   3   Flávio    1    35   85   1.78    7000        Vendas         91000
4   4    Bruno    1    40   78   1.75    6500            RH         84500
5   5   Daniel    1    32   90   1.80    6000            RH         78000
6   6 Fernando    1    28   88   1.82    7200 Administração         93600
7   7     João    0    32   58   1.60    6800            TI         88400
8   8  Gustavo    1    45   82   1.77    7100            TI         92300
9   9   Helena    0    30   62   1.68    7500            TI         97500
10 10  Isabela    0    45   70   1.72    8000 Administração        104000
11 11  Antônio    1    58   95   1.85    1000            RH         13000
        imc
1  23.87511
2  26.82742
3  26.82742
4  25.46939
5  27.77778
6  26.56684
7  22.65625
8  26.17383
9  21.96712
10 23.66144
11 27.75749

Usando pull() para Acessar uma Coluna como Vetor

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.