Manipulação de objetos em R

Manipulação de objetos

Leitura/Importação

Você pode importar um data.frame para o R de duas formas. A primeira delas, é carregando através do Environment no canto direito superior do RStudio. Clique em Import Dataset e selecione ‘From Text File’

O RStudio solicitará que você selecione o arquivo que deseja importar e, em seguida, abrirá um assistente para ajudá-lo a importar os dados. Use o assistente para informar ao RStudio qual nome dar ao conjunto de dados. Você também pode usar o assistente para informar ao RStudio qual caractere o conjunto de dados usa como separador, qual caractere ele usa para representar decimais (geralmente um ponto nos Estados Unidos e uma vírgula na Europa/Brasil) e se o conjunto de dados vem ou não com uma linha de nomes de coluna (conhecida como cabeçalho). Para ajudá-lo, o assistente mostra a aparência do arquivo bruto, bem como a aparência dos dados carregados com base nas configurações de entrada.

Você também pode desmarcar a caixa “Strings como fatores” no assistente. Eu recomendo fazer isso. Se você fizer isso, o R carregará todas as suas cadeias de caracteres como cadeias de caracteres. Caso contrário, R os converterá em fatores.

A outra forma de importar um arquivo no R, é usando direto no script a função ‘read.csv’. Vamos trabalhar com os dados da pnad, no arquivo amostra_pnad.csv. Ele é um arquivo de valores separados por vírgula ou CSV para abreviar. CSVs são arquivos de texto simples, o que significa que você pode abri-los em um editor de texto (assim como em muitos outros programas). Se você abrir amostra_pnad.csv, verá que ele contém uma tabela de dados semelhante à seguinte. Cada linha da tabela é salva em sua própria linha e uma vírgula é usada para separar as células dentro de cada linha. Cada arquivo CSV compartilha este formato básico:

“Ano”,“Trimestre”,“UF”,“V1022”,“V2007”,“V2009”,“V2010”,“VD2003”,“VD3005”,“VD4016” “2021”,“1”,“Ceará”,“Urbana”,“Homem”,80,“Branca”,2,“16 anos ou mais de estudo”,NA “2021”,“1”,“Distrito Federal”,“Urbana”,“Mulher”,19,“Parda”,4,“11 anos de estudo”,NA …e assim por diante

Vamos carregar novamente os dados da pnad que foram mostrados na aula passada:

url <- "https://raw.githubusercontent.com/laddem/site/master/amostra_pnad.csv"
df <- read.csv(url)
head(df)
##    Ano Trimestre               UF  V1022  V2007 V2009  V2010 VD2003
## 1 2021         1            Ceará Urbana  Homem    80 Branca      2
## 2 2021         1 Distrito Federal Urbana Mulher    19  Parda      4
## 3 2021         1       Pernambuco Urbana Mulher    36  Preta      2
## 4 2021         1   Santa Catarina Urbana  Homem    50  Parda      2
## 5 2021         1        São Paulo Urbana Mulher    43  Parda      3
## 6 2021         1            Goiás Urbana  Homem    35  Parda      3
##                      VD3005 VD4016
## 1 16 anos ou mais de estudo     NA
## 2         11 anos de estudo     NA
## 3         12 anos de estudo   1045
## 4          5 anos de estudo   1500
## 5          9 anos de estudo   1600
## 6         14 anos de estudo   3000

Se a importação ocorrer corretamente, o data.frame irá aparecer no ambiente Environment mostrando o número de observações e o número de variáveis (colunas).

Quando você importa um conjunto de dados, o RStudio salva os dados em um data frame e, em seguida, exibe o data frame em uma guia Exibir. Você pode abrir qualquer data frame em uma guia Exibir a qualquer momento com a função View().

Exercícios

Visualize os dados que você acabou de importar em formato de planilha através do Environment e usando a função View(). É possível também visualizar as 6 primeiras linhas do data.frame ou as 6 últimas linhas. Para isso, use as funções head() e tail().

Obs: se você quiser ver mais que 6 linhas, coloque o segundo argumento na função head(df, 10). Quantas linhas vão ser mostradas neste caso?

Escrita/Salvar

Você pode salvar e exportar um novo arquivo .csv para o seu computador. Assim, você pode enviá-lo por e-mail a um colega, armazená-lo em um pen drive ou abri-lo em um programa diferente. Você pode salvar quaisquer dados executados e alterados no R em um arquivo .csv com o comando write.csv.

write.csv(df, file = "df_pnad.csv", row.names = FALSE)

R transformará seu data frame em um arquivo de texto simples com o formato de valores separados por vírgula e salvará o arquivo em seu diretório de trabalho. Para ver onde está seu diretório de trabalho, execute getwd(). Para alterar a localização do seu diretório de trabalho, visite Sessão > Definir Diretório de Trabalho > Escolher Diretório na barra de menus do RStudio.

Você pode personalizar o processo de salvamento com o grande conjunto de argumentos opcionais de write.csv (consulte ?write.csv para obter detalhes). No entanto, existem três argumentos que você deve usar sempre que executar write.csv.

Primeiro, você deve fornecer a função write.csv o nome do data frame que deseja salvar. Em seguida, você deve fornecer um nome de arquivo para dar ao seu arquivo. R entenderá esse nome literalmente, portanto, certifique-se de fornecer uma extensão.

Finalmente, você deve adicionar o argumento row.names = FALSE. Isso impedirá R de adicionar uma coluna de números no início do seu data frame. Esses números identificarão suas linhas de 1 a 1000, mas é improvável que qualquer programa em que você abrir df_pnad.csv compreenderá o sistema de nomes de linhas. Muito provavelmente, o programa assumirá que os nomes das linhas são a primeira coluna de dados em seu data frame. Na verdade, isso é exatamente o que R assumirá se você reabrir df_pnad.csv. Se você salvar e abrir df_pnad.csv várias vezes em R, notará colunas duplicadas de números de linha se formando no início de seu data frame. Não posso explicar por que R faz isso, mas posso explicar como evitá-lo: use row.names = FALSE sempre que salvar dados com write.csv.

Notação

Para que você consiga trabalhar com valores individuais dentro do seu data frame, tarefa necessária em análise de dados, você pode selecionar valores dentro de um objeto R através do seu sistema de notação.

Selecionando valores

O R tem um sistema de notação que permite extrair valores de objetos R. Para extrair um valor ou conjunto de valores de um data frame, escreva o nome do data frame seguido por um par de colchetes:

df[ , ]
##       Ano Trimestre                  UF  V1022  V2007 V2009    V2010 VD2003
## 1    2021         1               Ceará Urbana  Homem    80   Branca      2
## 2    2021         1    Distrito Federal Urbana Mulher    19    Parda      4
## 3    2021         1          Pernambuco Urbana Mulher    36    Preta      2
## 4    2021         1      Santa Catarina Urbana  Homem    50    Parda      2
## 5    2021         1           São Paulo Urbana Mulher    43    Parda      3
## 6    2021         1               Goiás Urbana  Homem    35    Parda      3
## 7    2021         1               Amapá Urbana  Homem    72    Parda      3
## 8    2021         1           São Paulo Urbana Mulher    23  Amarela      8
## 9    2021         1    Distrito Federal Urbana  Homem    23    Parda      5
....
Saída truncada para visualização

Entre os colchetes estarão dois índices separados por uma vírgula. Os índices dizem ao R quais valores retornar. O R usará o primeiro índice para o subconjunto das linhas do dataframe e o segundo índice para o subconjunto das colunas. Ou seja, df[linhas, colunas].

Você pode pensar em um índice como um CEP ou o endereço de um valor ou um conjunto de valores, e a indexação como o processo que você utilizaria para encontrar um desses valores numa lista telefônica, no Google ou no Maps.

Você tem uma escolha quando se trata de escrever índices. Existem seis maneiras diferentes de escrever um índice para o R e cada uma faz algo ligeiramente diferente. Eles são todos muito simples e muito úteis, então vamos dar uma olhada em cada um deles. Você pode criar índices com:

  • Inteiros positivos
  • Inteiros negativos
  • Zero
  • Espaços em branco
  • Valores lógicos
  • Nomes

O mais simples de usar são os inteiros positivos.

Por exemplo, caso você queira extrair um valor que está na primeira linha e na quarta coluna do seu data frame, no caso, estamos usando o df, que é uma pequena amostra da pnad, lembra? Como podemos fazer isso?

df[1, 4]
## [1] "Urbana"

Para extrair mais de um valor, use um vetor com inteiros positivos. Por exemplo, se você quer retornar a primeira linha de df com df[1, c(1,2,3)] ou df[1, 1:3]

df[1,1:3]
##    Ano Trimestre    UF
## 1 2021         1 Ceará
df[1, c(1,2,3)]
##    Ano Trimestre    UF
## 1 2021         1 Ceará

Essa notação não é limitada somente a objetos do tipo data frame. Você pode usar a mesma sintaxe para selecionar valores em qualquer objeto R, desde que você forneça um índice para cada dimensão do objeto. Então, por exemplo, você pode definir um subconjunto de um vetor (que tem uma dimensão) com um único índice:

vec <- c(10, 15, 31, 60, 10, 2)
vec[1:3]
## [1] 10 15 31

Bom, isso é a notação usando usando inteiros positivos. Como seria com inteiros negativos? Quais as diferenças?

Vamos lá!

Os inteiros negativos fazem exatamente o oposto dos inteiros positivos durante a indexação. O R retornará todos os elementos, exceto os elementos em um índice negativo. Por exemplo, df[-1, 1:10] retornará tudo, exceto a primeira linha do data frame. df[-(2:999), 1:10] retornará a primeira linha e a última linha (e excluirá todo o resto):

df[-(2:999), 1:10]
##       Ano Trimestre             UF  V1022 V2007 V2009  V2010 VD2003
## 1    2021         1          Ceará Urbana Homem    80 Branca      2
## 1000 2021         1 Santa Catarina  Rural Homem    66 Branca      2
##                         VD3005 VD4016
## 1    16 anos ou mais de estudo     NA
## 1000          5 anos de estudo   1000
df[-1, 9]
##   [1] "11 anos de estudo"                       
##   [2] "12 anos de estudo"                       
##   [3] "5 anos de estudo"                        
##   [4] "9 anos de estudo"                        
##   [5] "14 anos de estudo"                       
##   [6] "16 anos ou mais de estudo"               
##   [7] "12 anos de estudo"                       
##   [8] "14 anos de estudo"                       
##   [9] "5 anos de estudo"                        
##  [10] "9 anos de estudo"                        
....
Saída truncada para visualização

A vantagem de usar inteiros negativos ao invés de inteiros positivos na indexação, é que os inteiros negativos são uma maneira mais eficiente de criar um subconjunto do que os inteiros positivos, se você quiser incluir a maioria das linhas ou colunas de um data frame.

Na notação df[-2,2] o que irá ser mostrado pelo R?

O que acontecerá se você usar o zero como um índice? Zero não é um inteiro positivo nem um inteiro negativo, mas ele ainda usará para fazer um tipo de subconjunto. O R, neste caso, não retornará nada de uma dimensão quando você usa zero como um índice:

df[0, 0]
## data frame with 0 columns and 0 rows

Pra ser sincera, indexar com 0 não ajuda em muita coisa.

Além dos inteiros positivos, inteiros negativos, e zero, você pode também usar espaços em branco na indexação. O espaço em branco no R vai extrair todos os valores em uma dimensão. Isso permite subdividir um objeto em uma dimensão, mas não nas outras, o que é útil para extrair linhas ou colunas inteiras de um data frame:

df[1, ]
##    Ano Trimestre    UF  V1022 V2007 V2009  V2010 VD2003
## 1 2021         1 Ceará Urbana Homem    80 Branca      2
##                      VD3005 VD4016
## 1 16 anos ou mais de estudo     NA
df[, 5]
##    [1] "Homem"  "Mulher" "Mulher" "Homem"  "Mulher" "Homem"  "Homem"  "Mulher"
##    [9] "Homem"  "Homem"  "Homem"  "Homem"  "Homem"  "Mulher" "Mulher" "Mulher"
##   [17] "Mulher" "Mulher" "Mulher" "Mulher" "Mulher" "Mulher" "Homem"  "Mulher"
##   [25] "Homem"  "Mulher" "Mulher" "Homem"  "Mulher" "Mulher" "Homem"  "Homem" 
##   [33] "Mulher" "Homem"  "Mulher" "Homem"  "Homem"  "Homem"  "Mulher" "Mulher"
##   [41] "Mulher" "Mulher" "Mulher" "Homem"  "Homem"  "Mulher" "Homem"  "Homem" 
##   [49] "Mulher" "Mulher" "Homem"  "Homem"  "Mulher" "Homem"  "Mulher" "Mulher"
##   [57] "Mulher" "Homem"  "Homem"  "Homem"  "Homem"  "Homem"  "Homem"  "Mulher"
##   [65] "Mulher" "Homem"  "Mulher" "Homem"  "Homem"  "Homem"  "Mulher" "Mulher"
##   [73] "Homem"  "Homem"  "Mulher" "Mulher" "Homem"  "Homem"  "Mulher" "Mulher"
....
Saída truncada para visualização

Estamos quase chegando no final dos tipos de indexação que são possíveis de serem feitas no R. No caso de valores lógicos, se você fornecer um vetor de TRUEs e FALSEs como seu índice, o R combinará cada TRUE e FALSE com uma linha do data frame (ou uma coluna, dependendo de onde você colocar o índice). O R então retornará cada linha que corresponde a um TRUE.

Pode ser útil imaginar R lendo o data frame e perguntando: “Devo retornar a enésima linha da estrutura de dados?” e depois consultar o enésimo valor do índice para obter sua resposta. Para que este sistema funcione, seu vetor deve ser tão longo quanto a dimensão que você está tentando subdividir:

df[1, c(TRUE, TRUE, FALSE)]
##    Ano Trimestre  V1022 V2007  V2010 VD2003 VD4016
## 1 2021         1 Urbana Homem Branca      2     NA
rows <- c(F, TRUE, TRUE, F, F, F, F, F, F, F, F, F, F, F, F, F, 
  F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, 
  F, F, F, F, F, F, F, F, F, F, F, F, F, F)

df[rows, ]
##      Ano Trimestre                 UF  V1022  V2007 V2009   V2010 VD2003
## 2   2021         1   Distrito Federal Urbana Mulher    19   Parda      4
## 3   2021         1         Pernambuco Urbana Mulher    36   Preta      2
## 54  2021         1           Rondônia Urbana  Homem    44  Branca      2
## 55  2021         1     Espírito Santo Urbana Mulher    45  Branca      4
## 106 2021         1       Minas Gerais  Rural  Homem    31   Parda      3
## 107 2021         1          São Paulo Urbana  Homem    14  Branca      4
## 158 2021         1            Alagoas Urbana  Homem    38   Parda      1
## 159 2021         1              Amapá Urbana Mulher    20   Parda      3
## 210 2021         1            Roraima Urbana  Homem    55   Parda      6
....
Saída truncada para visualização

Esse sistema será de grande ajuda na parte de modificação de valores que veremos daqui a pouco.

Finalmente, você pode pedir os elementos que deseja pelo nome - se o seu objeto tiver nomes (consulte Nomes). Essa é uma maneira comum de extrair as colunas de um data frame, já que as colunas quase sempre têm um nome:

names(df)
##  [1] "Ano"       "Trimestre" "UF"        "V1022"     "V2007"     "V2009"    
##  [7] "V2010"     "VD2003"    "VD3005"    "VD4016"
df[3, c("UF", "V2007", "V2010")]
##           UF  V2007 V2010
## 3 Pernambuco Mulher Preta
df[ , "VD3005"]
##    [1] "16 anos ou mais de estudo"               
##    [2] "11 anos de estudo"                       
##    [3] "12 anos de estudo"                       
##    [4] "5 anos de estudo"                        
##    [5] "9 anos de estudo"                        
##    [6] "14 anos de estudo"                       
##    [7] "16 anos ou mais de estudo"               
##    [8] "12 anos de estudo"                       
##    [9] "14 anos de estudo"                       
##   [10] "5 anos de estudo"                        
....
Saída truncada para visualização

Exercícios

Retorne a informação da observação 800, e as colunas Ano, VD3005, V2009, V2010 do nosso data frame da amostra da pnad. O que o R retornará? Faça a mesma indexação usando inteiros positivos ou inteiros negativos.

Diferentes seleções: [[ e $

Dois tipos de objeto em R obedecem a um segundo sistema opcional de notação. Você pode extrair valores de data frames e listas com a sintaxe $. Você encontrará a sintaxe $ repetidamente no R, então vamos examinar como ela funciona.

Para selecionar uma coluna de um data frame, escreva o nome do data frame, no caso df, e o nome da coluna separados por $. Observe que nenhuma aspa deve estar no nome da coluna:

df$V2009
##    [1]  80  19  36  50  43  35  72  23  23  47  71  16  48  13  25   3  27  83
##   [19]  55  79  14  80  20  21  22  69  57  27  63  35  28  41  39  71   7  45
##   [37]  11   9  48  14  48  47   5  36  25  55   8  64   7  58  30   1  18  44
##   [55]  45  17   9  24  11  11  71  75  49  20  55  31  60   2   7  81  68  15
##   [73]  31   2  44  40  49  55   9  40  55   0  35  32   7  63  62  54  48   5
##   [91]  46  49  20  90  16   0  41  15  67  26  22  18  58  63   0  31  14  39
##  [109]  34  44  61  48  47  29  43  65  10  36  20   7  28  18  23  75  37  49
##  [127]  45   3  61  54  38  50  41  47  39  44  32  27  66  55  70  69  41  31
##  [145]  38  91  62  30  21  59   4  29   5  24  83   6  15  38  20  89  85  44
##  [163]  73   7  49  22  33   5  18   4  27  22   0  21  74  26  58  52  77  36
....
Saída truncada para visualização

O R retornará todos os valores da coluna como um vetor. Esta notação $ é muito útil e muito usada porque você freqüentemente armazenará as variáveis de seus conjuntos de dados como colunas em um data frame. De vez em quando, você desejará executar uma função como mean() ou median() nos valores de uma variável. Em R, essas funções esperam um vetor de valores como entrada, e o df$V2009 entrega seus dados no formato certo:

mean(df$V2009)
## [1] 36.939

Você pode usar a mesma notação com $ com os elementos de uma lista, se eles tiverem nomes. Essa notação também tem uma vantagem com listas. Se você criar um subconjunto de uma lista da maneira usual, o R retornará uma nova lista que contém os elementos solicitados, mesmo se você solicitar apenas um único elemento.

lista <- list(numbers = c(1, 2), logical = TRUE, strings = c("a", "b", "c"))

lista
## $numbers
## [1] 1 2
## 
## $logical
## [1] TRUE
## 
## $strings
## [1] "a" "b" "c"
lista[1]
## $numbers
## [1] 1 2

O resultado é uma lista menor com um elemento. Esse elemento é o vetor c(1, 2). Isso pode ser irritante porque muitas funções R não funcionam com listas. Por exemplo, sum(lst[1]) retornará um erro. Para você conseguir fazer uma operação com lista, você precisará usar $:

sum(lista$numbers)
## [1] 3

Se os elementos em sua lista não tiverem nomes (ou você não quiser usar os nomes), você pode usar dois colchetes [[ ]], em vez de um, para criar um subconjunto da lista. Essa notação fará a mesma coisa que a notação $:

lista[[1]]
## [1] 1 2

Em outras palavras, se você subdividir uma lista com a notação de colchete único, o R retornará uma lista menor. Se você subdividir uma lista com a notação de colchetes duplos, o R retornará apenas os valores que estavam dentro de um elemento da lista. Você pode combinar esse recurso com qualquer um dos métodos de indexação de R:

lista["numbers"]
## $numbers
## [1] 1 2
lista[["numbers"]]
## [1] 1 2

Essa diferença é sutil, mas importante. Na comunidade R, há uma maneira popular e útil de pensar sobre isso. Imagine que cada lista é um trem e cada elemento é um vagão. Quando você usa colchetes simples, o R seleciona vagões de trem individuais e os retorna como um novo trem. Cada vagão mantém seu conteúdo, mas esse conteúdo ainda está dentro de um vagão de trem (ou seja, uma lista). Quando você usa colchetes duplos, o R realmente descarrega o carro e lhe devolve o conteúdo. Resumindo:

Use colchetes simples para selecionar vagões de trem e colchetes duplos para selecionar o conteúdo dentro de um vagão.

A metáfora do trem

Exercícios

Assim como na lista, é possível usar os colchetes [[ ]] em data frame. Tente usá-los no data frame da pnad. Quais são as diferenças encontradas?

Modificando valores

Para manipular os valores dentro do seu data frame, faça primeiro uma cópia que você pode manipular. Isso garantirá que você sempre tenha uma cópia original do data frame para usar (caso as coisas dêem errado):

df2 <- df

Modificando os valores diretamente

Você pode usar o sistema de notação de R para modificar valores dentro de um objeto. Primeiro, descreva o valor (ou valores) que você deseja modificar. Em seguida, use o operador de atribuição <- para sobrescrever esses valores. O R irá atualizar os valores selecionados no objeto original. Em um exemplo real:

vetor <- c(0, 0, 0, 0, 0, 0)
vetor
## [1] 0 0 0 0 0 0

Você pode selecionar um valor dentro desse vetor· Neste caso selecionamos o primeiro:

vetor[1]
## [1] 0

E aqui, podemos modificar o valor:

vetor[1] <- 35
vetor
## [1] 35  0  0  0  0  0

Você pode substituir vários valores de uma vez, desde que o número de novos valores seja igual ao número de valores selecionados:

vetor[c(3, 4, 5)] <- c(1, 1, 1)
vetor
## [1] 35  0  1  1  1  0
vetor[4:6] <- vetor[4:6] + 1
vetor
## [1] 35  0  1  2  2  1

Você também pode criar valores que ainda não existem em seu objeto. O R irá expandir o objeto para acomodar os novos valores:

vetor[7] <- 20
vetor
## [1] 35  0  1  2  2  1 20

Isto é uma ótima maneira de adicionar novas variáveis ao data frame:

df2$nova_coluna <- 1:1000

head(df2)
##    Ano Trimestre               UF  V1022  V2007 V2009  V2010 VD2003
## 1 2021         1            Ceará Urbana  Homem    80 Branca      2
## 2 2021         1 Distrito Federal Urbana Mulher    19  Parda      4
## 3 2021         1       Pernambuco Urbana Mulher    36  Preta      2
## 4 2021         1   Santa Catarina Urbana  Homem    50  Parda      2
## 5 2021         1        São Paulo Urbana Mulher    43  Parda      3
## 6 2021         1            Goiás Urbana  Homem    35  Parda      3
##                      VD3005 VD4016 nova_coluna
## 1 16 anos ou mais de estudo     NA           1
## 2         11 anos de estudo     NA           2
## 3         12 anos de estudo   1045           3
## 4          5 anos de estudo   1500           4
## 5          9 anos de estudo   1600           5
## 6         14 anos de estudo   3000           6

Da mesma forma que você criou uma nova coluna, é possível removê-la atribuindo o valor NULL

df2$nova_coluna <- NULL

head(df2)
##    Ano Trimestre               UF  V1022  V2007 V2009  V2010 VD2003
## 1 2021         1            Ceará Urbana  Homem    80 Branca      2
## 2 2021         1 Distrito Federal Urbana Mulher    19  Parda      4
## 3 2021         1       Pernambuco Urbana Mulher    36  Preta      2
## 4 2021         1   Santa Catarina Urbana  Homem    50  Parda      2
## 5 2021         1        São Paulo Urbana Mulher    43  Parda      3
## 6 2021         1            Goiás Urbana  Homem    35  Parda      3
##                      VD3005 VD4016
## 1 16 anos ou mais de estudo     NA
## 2         11 anos de estudo     NA
## 3         12 anos de estudo   1045
## 4          5 anos de estudo   1500
## 5          9 anos de estudo   1600
## 6         14 anos de estudo   3000

Você pode selecionar um conjunto de linhas dentro de um data frame usando uma combinação dos sistemas de notação do R. Você pode destacar apenas os valores que você quer, definindo a dimensão das colunas do df2 com [. Ou, você pode definir um subconjunto da coluna df2$UF, misturando o $ com o [.

df2[c(5, 8, 39,44), ]
##     Ano Trimestre        UF  V1022  V2007 V2009   V2010 VD2003
## 5  2021         1 São Paulo Urbana Mulher    43   Parda      3
## 8  2021         1 São Paulo Urbana Mulher    23 Amarela      8
## 39 2021         1 São Paulo Urbana Mulher    48  Branca      3
## 44 2021         1 São Paulo Urbana  Homem    36  Branca      2
##                       VD3005 VD4016
## 5           9 anos de estudo   1600
## 8          12 anos de estudo   1200
## 39         12 anos de estudo   1200
## 44 16 anos ou mais de estudo     NA
## selecionando linhas especificas e a coluna V2010
df2[c(5, 8, 39,44), 6]
## [1] 43 23 48 36
## podemos fazer o mesmo dessa forma
df2$V2009[c(5, 8, 39,44)]
## [1] 43 23 48 36

Suponha que você sabe que os valores dessas linhas na coluna V2009 estão errados e você precisa arrumá-los atribuindo novos valores. O conjunto de novos valores terá que ser do mesmo tamanho que o conjunto de valores que você está substituindo.

df2$V2009[c(5, 8, 39,44)] <- c(23, 23, 23, 23)

# ou

df2$V2009[c(5, 8, 39,44)]<- 23

head(df2, 44)
##     Ano Trimestre                UF  V1022  V2007 V2009   V2010 VD2003
## 1  2021         1             Ceará Urbana  Homem    80  Branca      2
## 2  2021         1  Distrito Federal Urbana Mulher    19   Parda      4
## 3  2021         1        Pernambuco Urbana Mulher    36   Preta      2
## 4  2021         1    Santa Catarina Urbana  Homem    50   Parda      2
## 5  2021         1         São Paulo Urbana Mulher    23   Parda      3
## 6  2021         1             Goiás Urbana  Homem    35   Parda      3
## 7  2021         1             Amapá Urbana  Homem    72   Parda      3
## 8  2021         1         São Paulo Urbana Mulher    23 Amarela      8
## 9  2021         1  Distrito Federal Urbana  Homem    23   Parda      5
....
Saída truncada para visualização

Observe que você está mudando os valores dos objetos salvos em df2, nos livros em inglês, isso é chamado de modify in place. Você não acaba com uma cópia modificada do df2; os novos valores aparecerão dentro do df2. É preciso fazer isso de forma consciente e segura, para não sobrescrever informações, por isso, recomendamos trabalhar com cópias do objeto original (df2 ao invés de df).

A mesma técnica funcionará se você armazenar seus dados em um vetor, matriz, array, lista ou data frame. Basta descrever os valores que você deseja alterar com o sistema de notação de R e, em seguida, atribuir esses valores com o operador de atribuição de R <-.

Exercícios

Considere o vetor abaixo. Atribua um novo valor na posição 3 deste vetor. É possível atribuir uma string no lugar de um número?

vetor_x<- c(10,30,50,10)

Modificando com testes lógicos

E se você precisa saber um valor específico e precise que o R te retorne a linha em que este valor está? Por que no caso anterior você sabia as linhas que você queria mudar, mas e quando o seu objeto é grande e você não sabe exatamente onde a informação se encontra? Como fazer?

Lembra do sistema de notação do R que permitia valores lógicos? Você pode deixar um teste lógico criar um vetor de TRUEs e FALSEs para você.

Um teste lógico é uma comparação como “um é menor que dois?”, 1 < 2 ou “três é maior que quatro?”, 3 > 4. O R fornece sete operadores lógicos que você pode usar para fazer comparações, e eles podem ser vistos na tabela abaixo.

Cada operador retorna TRUE ou FALSE. Se você usar um operador para comparar vetores, o R fará comparações entre elementos - assim como faz com os operadores aritméticos:

Table: Table 1: Operadores lógicos

Operador Sintaxe Teste
> a > b a é maior que b?
>= a >= b a é maior ou igual a b?
< a < b a é menor que b?
<= a <= b a é menor ou igual a b?
== a == b a é igual a b?
!= a != b a é diferente de b?
%in% a %in% c(a, b, c) a está contido em algum dos elementos de b?
1 > 2
## [1] FALSE
1 > c(0, 1, 2)
## [1]  TRUE FALSE FALSE
c(1, 2, 3) == c(3, 2, 1)
## [1] FALSE  TRUE FALSE

O operador %in% é o único que não executa normalmente o elemento inteiro. %in% testa se os valores do lado esquerdo estão no vetor do lado direito. Se você fornecer um vetor no lado esquerdo, este operador não irá emparelhar os valores à esquerda com os valores à direita e, em seguida, fará testes de elementos. Em vez disso, ele testará independentemente se cada valor à esquerda está em algum lugar do vetor à direita:

1 %in% c(3, 4, 5)
## [1] FALSE
c(1, 2) %in% c(3, 4, 5)
## [1] FALSE FALSE
c(1, 2, 3) %in% c(3, 4, 5)
## [1] FALSE FALSE  TRUE
c(1, 2, 3, 4) %in% c(3, 4, 5)
## [1] FALSE FALSE  TRUE  TRUE

Observe que você testa a igualdade com um sinal de igual duplo, ==, e não um único sinal de igual, =, que é outra maneira de escrever <-. É fácil esquecer e usar a = b para testar se a é igual a b. Infelizmente, você terá uma surpresa desagradável. O R não retornará TRUE ou FALSE, porque não terá que: a será igual a b, porque você acabou de executar o equivalente a a <- b.

Você pode comparar quaisquer dois objetos no R com um operador lógico; no entanto, os operadores lógicos fazem mais sentido se você comparar dois objetos do mesmo tipo de dados. Se você comparar objetos de diferentes tipos de dados, o R usará suas regras de coerção para forçar os objetos ao mesmo tipo antes de fazer a comparação.

Exercícios

Extraia a coluna V2010 do df2 e teste os valores igual a ‘Branca’. Além disso conte quantas linhas são iguais a ‘Branca’. Dica: use a função sum() para fazer a contagem.

Para resumir, você pode usar um teste lógico para selecionar valores dentro de um objeto.

O subconjunto lógico é uma técnica poderosa porque permite identificar, extrair e modificar rapidamente valores individuais em seu conjunto de dados. Ao trabalhar com subconjuntos lógicos, você não precisa saber onde existe um valor em seu conjunto de dados. Você só precisa saber como descrever o valor com um teste lógico.

Além dos operadores lógicos, também temos os operadores booleanos, os operadores booleanos são como & ou |. Eles reduzem os resultados de vários testes lógicos em um único TRUE ou FALSE. Os operadores e seus testes podem ser vistos na tabela abaixo.

Table: Table 2: Operadores booleanos

Operador Sintaxe Teste
& cond1 & cond2 cond1 e cond2 são simultâneamente verdadeiros?
| cond1 | cond2 cond1 ou cond2 é verdadeiro?
xor xor(cond1, cond2) Apenas cond1 ou apenas cond2 é verdadeiro?
! !cond1 Inverta o resultado de cond1
any any(cond1, cond2, cond3, …) Algum resultado em c(cond1, cond2, cond3, …) é verdadeiro?
all all(cond1, cond2, cond3, …) Todos os resultados em c(cond1, cond2, cond3, …) são verdadeiros?

Para usar um operador booleano, coloque-o entre dois testes lógicos completos. O R irá executar cada teste lógico e, em seguida, usar o operador booleano para combinar os resultados em um único TRUE ou FALSE.

Quando usados com vetores, os operadores booleanos seguirão a mesma execução elementar que os operadores aritméticos e lógicos:

a <- c(1, 2, 3)
b <- c(1, 2, 3)
c <- c(1, 2, 4)

a == b
## [1] TRUE TRUE TRUE
b == c
## [1]  TRUE  TRUE FALSE
a == b & b == c
## [1]  TRUE  TRUE FALSE

Você pode usar um operador booleano para localizar as pessoas de 40 anos e de escolaridade 9 anos de estudo no df2.

df2$V2009 == 40 & df2$VD3005 == "8 anos de estudo"
##    [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##   [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
....
Saída truncada para visualização

Valores desconhecidos

Problemas com informações desconhecidas acontecem com frequência na análise de dados. Normalmente, eles são mais simples: você não sabe um valor porque a medição foi perdida, corrompida ou nunca feita para começar. O R tem uma maneira de ajudá-lo a gerenciar esses valores ausentes.

O caractere NA é um símbolo especial em R. Ele significa “não disponível” e pode ser usado como um espaço reservado para informações ausentes. O R tratará NA exatamente como você deseja que as informações ausentes sejam tratadas. Por exemplo, qual resultado você esperaria se adicionar 1 a uma informação ausente?

1 + NA
## [1] NA

O R retornará uma segunda informação faltante. Não seria correto dizer que 1 + NA = 1 porque há uma boa chance de que o valor ausente não seja zero. Você não tem informações suficientes para determinar o resultado.

NA == 1
## [1] NA

Valores ausentes podem ajudá-lo a contornar lacunas em seus conjuntos de dados, mas também podem criar alguns problemas frustrantes. Suponha, por exemplo, que você coletou 1.000 observações e deseja tirar sua média com a função mean(). Se um dos valores for NA, seu resultado será NA:

c(NA, 1:50)
##  [1] NA  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
## [26] 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
## [51] 50
mean(c(NA, 1:50))
## [1] NA

A maioria das funções R vem com o argumento opcional, na.rm, que significa NA remove. o R irá ignorar NAs quando avaliar uma função se você adicionar o argumento na.rm = TRUE:

mean(c(NA, 1:50), na.rm = TRUE)
## [1] 25.5

Ocasionalmente, você pode querer identificar os NAs em seu conjunto de dados com um teste lógico, mas isso também cria um problema. Como você faria isso? Se algo for um valor ausente, qualquer teste lógico que o use retornará um valor ausente, até mesmo este teste:

NA == NA
## [1] NA

O que significa que testes como este não ajudarão você a encontrar valores ausentes:

c(1, 2, 3, NA) == NA
## [1] NA NA NA NA

O R fornece uma função especial que pode testar se um valor é um NA. A função é is.na:

is.na(NA)
## [1] TRUE
vet <- c(1, 2, 3, NA)

is.na(vet)
## [1] FALSE FALSE FALSE  TRUE

Exercícios

Conte o número de NAs na coluna VD4016 do data frame df2.

Revisão

Na aula de hoje falamos sobre como importar dados, exportar dados, manipulação e diferentes notações para identificação de informações e modificação.

Para selecionar os valores em um data frame, ou em outro objeto R, aprendemos a usar a notação data.frame[ , ] e a partir dessa notação, selecionar diferentes linhas e colunas, usando números inteiros, números negativos, espaços em branco, valores lógicos e nomes.

Aprendemos com listas e dataframes a seleção pela notação de colchetes duplos [[ e $.

Em relação a modificação de valores, aprendemos a modificar os valores no local dentro de um objeto R ao combinar a sintaxe da notação de R com o operador de atribuição, <-. Isso permite que você atualize seus dados e limpe seus conjuntos de dados.

Aprendemos diferentes operadores lógicos: >; >=; <; <=; ==; !=; %in% e operadores booleanos: &; |; xor; !; any; all.

Quando você trabalha com grandes conjuntos de dados, modificar e recuperar valores cria um problema logístico próprio. Como você pode pesquisar os dados para encontrar os valores que deseja modificar ou recuperar? Como um usuário R, você pode fazer isso com subconjuntos lógicos. Crie um teste lógico com operadores lógicos e booleanos e, em seguida, use o teste como um índice na notação de colchetes de R. O R retornará os valores que você está procurando, mesmo se você não souber onde eles estão.

Exercícios

Para os próximos exercícios considere o data frame da pnad que estamos usando nas aulas.

  1. Como você selecionaria o mesmo valor abaixo, mas usando inteiros negativos na seleção?

    df2[1,5]
    
    ## [1] "Homem"
    
  2. Qual a diferença em usar em selecionar determinada informação em um data frame usando colchetes duplos [[]] e usando colchetes simples? Observe o exemplo abaixo para responder:

    df2[['Ano']]
    
    ##    [1] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ##   [15] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ##   [29] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ##   [43] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ##   [57] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ##   [71] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ##   [85] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ##   [99] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ##  [113] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ##  [127] 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021 2021
    ....
    Saída truncada para visualização
    
    df['Ano']
    
    ##       Ano
    ## 1    2021
    ## 2    2021
    ## 3    2021
    ## 4    2021
    ## 5    2021
    ## 6    2021
    ## 7    2021
    ## 8    2021
    ## 9    2021
    ....
    Saída truncada para visualização
    
  3. Considere o data frame abaixo:

    sala <- data.frame(
      id = c(1, 2, 3, 4, 5, 6),
      idade = c(20, 25, 30, 35, 40, 45),
      nome = c("Fulano", "Cicrano", "Beltrano", "Herculano", "Mariano", "Carrano"),
      sexo = "Masculino",
      origem = c("Campinas", "Barueri", "Monte Verde", "Rio de Janeiro", "Natal", "Belo Horizonte")
    )
    

    Modifique o nome de ‘Mariano’ por ‘Mariana’. E altere a variável sexo para que seja um vetor que altere o valor para ‘Feminino’ na posição em que o nome foi trocado para Mariana.

  4. Considere o mesmo data frame sala construído no exercício anterior. Usando testes lógicos e operadores Booleanos. Verifique:

    a. se existe algum aluno que seja do sexo Masculino e seja de São Paulo.
    b. se existe algum aluno que tem idade maior ou igual a 20 anos ou que seja de Campinas. c. se existe alguém com o nome Beltrano.

  5. Agora considere o seguinte data frame e, usando as funções apropriadas ensinadas na aula de hoje, responda:

    cadastro <- data.frame(
      id = c(10, 105, 299, 645, 7907, 8660, 4992, 630),
      idade = c(20, 25, 30, 35, 40, 45, 60, 53),
      nome = c("Thais", NA, "Guilherme", "Betânia", "Ana Lucia", NA, NA, "Pâmela"),
      sexo = c("Feminino", "Masculino","Masculino", NA ,NA, "Feminino", "Masculino", "Feminino"),
      origem = c("Campinas", NA, "Monte Verde", "Rio de Janeiro", NA, "Belo Horizonte","São Paulo",
                 "Rio de Janeiro")
    )
    
    1. Quantos NAs existe na coluna nome?
    2. Quantos NAs existe na coluna sexo?
    3. Quantos NAs existe na coluna origem?
    4. Substitua os NAs na coluna sexo pelo valor ‘Feminino’
  6. Salve o data frame ‘cadastro’ do exercicio anterior em um arquivo .csv. Como você faria isso? Quais os argumentos que devem ser usados?


Previous
Next