-
Notifications
You must be signed in to change notification settings - Fork 2
/
Script Aula 3 - Manipulando quase qualquer base.R
319 lines (229 loc) · 9.94 KB
/
Script Aula 3 - Manipulando quase qualquer base.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
### Script Aula 4 - Manipulando quase qualquer base;
# Entendendo o conceito de datasets Wide e Long
# Vamos carregar o tidyverse
library(tidyverse)
# E fazer uso de alguns datasets do pacote tidyr
# Um dataset pode apresentar os dados de multiplas maneiras. No exemplo abaixo
# vemos alguns exemplos
# Dataset com todas as informações
tidyr::table1
# Dataset em um formato Wide
tidyr::table4a #cases
tidyr::table4b # population
# Um dataset está organizado quando 1. cada variável tem sua própria coluna
# 2. Cada observação tem sua própria linha
# 3. Cada valor está em sua própria célula
# No dataset table 1 temos um exemplo de tidy dataset. o R funciona melhor com tidy data
# E como transformar um dataset para um formato tidy
# Uma da possibilidades é usando pivoting
table4a
# Como transformar o dataset table4a em um formato tidy? o que Devemos mudar?
table4a %>% #dataset que receberá a função
pivot_longer( # Usamos a função pivot_longer
c(`1999`, `2000`), #Indicamos as colunas que sofrerão a transformação
names_to = "year", #Indicamos a coluna que receberá valor de classificação
values_to = "cases"#Indicamos a coluna que receberá os valores
)
# Sempre que quisermos organizar um dataset em um formato long,
#usaremos a função tidyr:: pivot_longer
table4b %>% #dataset que receberá a função
pivot_longer( # Usamos a função pivot_longer
c(`1999`, `2000`), #Indicamos as colunas que sofrerão a transformação
names_to = "year", #Indicamos a coluna que receberá valor de classificação
values_to = "population"#Indicamos a coluna que receberá os valores
)
# Um outro exemplo de datasets que não estão em formato tidy é o dataset table2
table2
# Observem que a coluna type tem multiplas variáveis dentro da mesma coluna.
# Onde cada observação é um pais em um determinado ano, mas cada observação
#está espalhada em duas linhas, já que temos 2 variáveis em type.
# Para transformamos esse dataset em um formato tidy usando a função tidyr::pivot_wider()
table2 %>%
pivot_wider(names_from = type, # coluna que contém as variáveis
values_from = count # coluna que contém os valores das variáveis
)
### Revisão
# importe o dataset dados_b3_2010_2022.csv
# remova a 1° coluna
# Transforme o dataset para o formato tidy
dados_b3_2010_2022.csv <- readr::read_csv("https://raw.githubusercontent.com/BaruqueRodrigues/Curso-de-R/master/dados/dados_b3_2010_2022.csv")
dados_b3_2010_2022.csv %>%
select(-1) %>%
pivot_wider(names_from = ticker,
values_from = ret_adjusted_prices)
# Transforme o dataset abaixo para o formato tidy()
people <- tribble(
~name, ~names, ~values,
#-----------------|--------|------
"Phillip Woods", "age", 45,
"Phillip Woods", "height", 186,
"Phillip Woods", "age", 50,
"Jessica Cordero", "age", 37,
"Jessica Cordero", "height", 156
)
### Separando e juntando dados
# Alguns datasets tem particularidades,onde os valores das colunas ficam aninhandos
#dentro de celulas como no dataset table3
tidyr::table3
# Quando nos deparamos com esses tipo de problema temos uma solução muito simples
#a função tidyr::separate
table3
# Aqui vamos separar a coluna rate, que junta os valores de cases e population
table3 %>% # dataset que receberá a função
separate( # função que irá separar a coluna
rate, # coluna que será separada
sep = "/", # argumento que deve ser separado
into = c("cases", "population") # nome das colunas que serão separadas
)
# Podemos usar a função separate de diversar formas, de maneira quase ilimtada
table3 %>% # dataset que receberá a função
separate(# função que irá separar a coluna
year, # coluna que será separada
into = c("century", "year"), # nome das colunas que serão separadas
sep = 2 # argumento que deve ser separado
)
# Caso tenhamos que juntar valores que estão separados em colunas diferentes
#podemos usar a função unite
table5
# Nesse caso juntaremos as colunas century e year
table5 %>% # dataset que receberá a função
unite( # função que juntará as colunas
ano_completo, # nova coluna
century, year, #colunas que serão juntas
sep = "" #separador
)
### Revisão
# Importe o dataset pedidos
# remova a primeira linha e transforme ele em um formato tidy
# 1. onde a descrição por pedido seja separado em multiplos itens
# 2. o dataset tenha um formato long
pedidos <- readr::read_csv(
"https://raw.githubusercontent.com/BaruqueRodrigues/Curso-de-R/master/dados/pedidos.csv")
pedidos %>%
select(-1) %>%
separate(descricao_por_pedido,
into = c("item_1",
"item_2",
"item_3",
"item_4",
"item_5"),
sep = ",") %>%
pivot_longer(c(item_1:item_5),
names_to = "item_pedido",
values_to = "desc_pedido")
### lidando com Missing Data
# Existem 3 funções poderosas que podemos usar para lidar com dados ausentes
#são elas drop_na(), fill(), replace_na()
#usaremos o dataset pedidos, que usamos na revisão para exemplificar
pedidos_final <- pedidos %>%
select(-1) %>%
separate(descricao_por_pedido,
into = c("item_1",
"item_2",
"item_3",
"item_4",
"item_5"),
sep = ",") %>%
pivot_longer(c(item_1:item_5),
names_to = "item_pedido",
values_to = "desc_pedido")
pedidos_final
# drop_na() lida com dados ausentes removendo eles do dataset
pedidos_final %>%
drop_na()
# fill() vai preencher os valores ausentes com um valor da coluna usando o
#valor mais próximo do dado ausente
# A função fill é utilizada apenas para variáveis numéricas
# replace_na vai substituir os dados ausentes por valores especificados
pedidos_final %>%
replace_na(# função que vai substituir NA pelo valor desejado
list( # usamos a função list pois podemos inserir várias colunas
desc_pedido = "item_ausente" #indicando o substituto por coluna
)
)
### Transformando vetores de texto em datasets
# Muitas vezes recebemos dados em formato de lista, ou formato textual
#e precisamos transforma-los para um formato de dataset
# Uma das funções mais poderosas pra esse objetivo a a função tibble::enframe()
dados_lista <- list(times = c("flamengo", "fluminense", "vasco", "botafogo"),
titulos_liberta = c(2, "virgem das americas", 1, "bairro"),
copas_br = c(3, 1, 1, "bairro"),
brasileiros = c(8,4,4,1))
# Utilizando o enframe para transformar uma lista em um dataset
dados_lista %>%
enframe()
# Observe que diferente de um dataset comum, as colunas estão como formato list
dados_lista %>%
enframe()
# Olhando mais de perto
dados_lista %>%
enframe() %>%
View()
# Para transformar em um formato usual devemos transformar esse dataset em formato tidy
dados_lista %>%
enframe() %>%
pivot_wider(names_from = name,
values_from = value)
# Para transformar em um formato usual podemos usar as funções unnest_wider e unnest_longer
#unnest_wider espalha os valores colunas, unnest_longer em linhas
dados_lista %>%
enframe() %>%
pivot_wider(names_from = name,
values_from = value) %>%
unnest_longer(c(times:brasileiros))
### Aplicando funções para multiplas colunas
# Quando queremos operacionalizar uma função entre multipla colunas podemos usar
#as funções com a terminação all
iris %>% # dataset que irá receber a função
tibble() %>% # transformando em tibble
mutate_all( as.character())
iris %>% # dataset que irá receber a função
tibble() %>% # transformando em tibble
summarise_all(mean)
# Mas quando queremos declarar as colunas usamos odplyr::across
# Por exemplo transformar o formato de multiplas colunas para character
iris %>% # dataset que irá receber a função
tibble() %>% # transformando em tibble
mutate(across( # aplica uma função há uma série de colunas
c(Sepal.Length, Sepal.Width), #colunas que irão receber a função
as.character #função desejada
))
# Ou por exemplo arredondar multiplas colunas
iris %>% # dataset que irá receber a função
tibble() %>% # transformando em tibble
mutate(across( # aplica uma função há uma série de colunas
c(Sepal.Length, Sepal.Width), #colunas que irão receber a função
round #função desejada
))
iris %>% # dataset que irá receber a função
tibble() %>% # transformando em tibble
group_by(Species) %>%
summarise(across(# aplica uma função há uma série de colunas
c(Sepal.Length:Petal.Width), #colunas que irão receber a função
list(min, mean, sd, max), # lista de funções
na.rm = TRUE #argumento extra
))
### Eninhando dados
# A função nest nos permite juntar elementos dentro de uma coluna de um dataset
mpg %>%
nest(-model)
# A partir disso podemos fazer multiplas análises
# Como por exemplo performas multiplas regressões
mpg %>%
nest(-model) %>%
mutate(lm_model = map(data, ~lm(hwy~cty+cyl, data =.)),
lm_model = map(lm_model, broom::tidy)
) %>%
unnest(lm_model)
# Ou por exemplo performar multiplos testes T
t_test_1 %>% # dataset com as variaveis para o teste t
select(-grupo) %>%
gather(name, value, -grupo_rec) %>%
nest(-name) %>%
mutate(teste_t = map(data, ~t.test(value~grupo_rec, data = .)))
# Inserir um gráfico de dispersão
mpg %>%
nest(-model) %>%
mutate(grafico = map(data, ~ggplot(data = .,
aes(x = hwy, y = cty))+
geom_point()))