Manipulação de dados


In [ ]:
# install.packages('tidyverse')

Usando o dplyr


In [1]:
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


In [2]:
df <- mtcars
str(df)


'data.frame':	32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

In [3]:
# Filtrando apenas os registros com determinadas condições:
head(filter(df,cyl<8,hp>100))


mpgcyldisphpdratwtqsecvsamgearcarb
21.0 6 160.0110 3.90 2.62016.460 1 4 4
21.0 6 160.0110 3.90 2.87517.020 1 4 4
21.4 6 258.0110 3.08 3.21519.441 0 3 1
18.1 6 225.0105 2.76 3.46020.221 0 3 1
19.2 6 167.6123 3.92 3.44018.301 0 4 4
17.8 6 167.6123 3.92 3.44018.901 0 4 4

In [4]:
# Usando o resultado para criar outro DataFrame:
df2 <- filter(df,cyl<8,hp>100)

In [6]:
# Pegando partes de um DataFrame. Da linha 10 à linha 20 (inclusive) - 11 linhas:
slice(df,10:20)


mpgcyldisphpdratwtqsecvsamgearcarb
19.2 6 167.6123 3.92 3.44018.301 0 4 4
17.8 6 167.6123 3.92 3.44018.901 0 4 4
16.4 8 275.8180 3.07 4.07017.400 0 3 3
17.3 8 275.8180 3.07 3.73017.600 0 3 3
15.2 8 275.8180 3.07 3.78018.000 0 3 3
10.4 8 472.0205 2.93 5.25017.980 0 3 4
10.4 8 460.0215 3.00 5.42417.820 0 3 4
14.7 8 440.0230 3.23 5.34517.420 0 3 4
32.4 4 78.7 66 4.08 2.20019.471 1 4 1
30.4 4 75.7 52 4.93 1.61518.521 1 4 2
33.9 4 71.1 65 4.22 1.83519.901 1 4 1

In [7]:
# Classificando por cyl e depois por mpg:
head(arrange(df,cyl,mpg))


mpgcyldisphpdratwtqsecvsamgearcarb
21.4 4 121.0109 4.11 2.78018.601 1 4 2
21.5 4 120.1 97 3.70 2.46520.011 0 3 1
22.8 4 108.0 93 3.85 2.32018.611 1 4 1
22.8 4 140.8 95 3.92 3.15022.901 0 4 2
24.4 4 146.7 62 3.69 3.19020.001 0 4 2
26.0 4 120.3 91 4.43 2.14016.700 1 5 2

In [9]:
# Os carros que consomem menos (do mpg maior para o menor)
head(arrange(df,desc(mpg)))


mpgcyldisphpdratwtqsecvsamgearcarb
33.9 4 71.1 65 4.22 1.83519.901 1 4 1
32.4 4 78.7 66 4.08 2.20019.471 1 4 1
30.4 4 75.7 52 4.93 1.61518.521 1 4 2
30.4 4 95.1113 3.77 1.51316.901 1 5 2
27.3 4 79.0 66 4.08 1.93518.901 1 4 1
26.0 4 120.3 91 4.43 2.14016.700 1 5 2

In [11]:
# Selecionando colunas e criando outro DataFrame:
carros <- select(df,cyl,hp)

In [12]:
head(carros)


cylhp
Mazda RX46 110
Mazda RX4 Wag6 110
Datsun 7104 93
Hornet 4 Drive6 110
Hornet Sportabout8 175
Valiant6 105

In [14]:
# Quantos tipos de cilindros diferentes existem?
distinct(select(df,cyl))


cyl
6
4
8

In [15]:
# Criando uma nova coluna (hp por cilindro):
head(mutate(df, hp_cyl = hp / cyl))


mpgcyldisphpdratwtqsecvsamgearcarbhp_cyl
21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 18.33333
21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 18.33333
22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 23.25000
21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 18.33333
18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 21.87500
18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 17.50000

In [16]:
# Resumindo um DataFrame por agregação. Média de hp dos carros:
summarise(df,Media_HP=mean(hp,na.rm=TRUE)) # na.rm=TRUE remove as linhas sem valores em HP


Media_HP
146.6875

Operador PIPE "%>%"


In [19]:
# Permite concatenar operações sobre um mesmo DataFrame
df <- mtcars %>% select(mpg,hp,cyl) %>% arrange(desc(mpg),cyl)
head(df)


mpghpcyl
33.9 65 4
32.4 66 4
30.4 52 4
30.4113 4
27.3 66 4
26.0 91 4

Usando o tidyr

gather cria novas linhas, fazendo um "pivô", uma transposição de colunas em linhas. Vamos criar um DataFrame assim


In [24]:
library(tidyr)

In [25]:
filial <- c(100,200)
ano <- c(2016,2016,2017,2017)
semestre1 <- c(153450.00,102300.00)
semestre2 <- c(195370.00,122300.00)
df_vendas <- data.frame(filial=filial,ano=ano,semestre1 = semestre1,semestre2 = semestre2)

In [26]:
df_vendas


filialanosemestre1semestre2
100 2016 153450195370
200 2016 102300122300
100 2017 153450195370
200 2017 102300122300

Vamos separar semestre 1 e semestre 2 em linhas, em vez de colunas:


In [27]:
df_vendas2 <- gather(df_vendas,semestre,venda,semestre1:semestre2)
df_vendas2


filialanosemestrevenda
100 2016 semestre1153450
200 2016 semestre1102300
100 2017 semestre1153450
200 2017 semestre1102300
100 2016 semestre2195370
200 2016 semestre2122300
100 2017 semestre2195370
200 2017 semestre2122300

A função spread faz o contrário da função gather transpondo linhas em colunas:


In [28]:
df_vendas3 <- spread(df_vendas2,semestre,venda)
df_vendas3


filialanosemestre1semestre2
100 2016 153450195370
100 2017 153450195370
200 2016 102300122300
200 2017 102300122300

A função separate separa campos em linhas, de acordo com uma expressão regular. Suponha o dataset "desemprego.csv", o campo "periodo" é formado por ano + "." + mês. A coluna a ser separada tem que ser do tipo "caractere" e não numérica! Vamos separar ano e mês:


In [42]:
df_desemprego <- read.csv('desemprego.csv',colClasses= c('character','numeric'))
str(df_desemprego)


'data.frame':	121 obs. of  2 variables:
 $ Periodo   : chr  "2007.08" "2007.09" "2007.10" "2007.11" ...
 $ Desemprego: num  10.4 10.5 10 10 9.3 9.3 9.1 9.6 9.8 9.8 ...

In [43]:
head(df_desemprego)


PeriodoDesemprego
2007.0810.4
2007.0910.5
2007.1010.0
2007.1110.0
2007.12 9.3
2008.01 9.3

In [49]:
df_sep <- separate(df_desemprego,'Periodo',c('ano','mes'),sep='[.]')
head(df_sep)


anomesDesemprego
200708 10.4
200709 10.5
200710 10.0
200711 10.0
200712 9.3
200801 9.3

A função unite faz o contrário:


In [47]:
df_original <- unite(df_sep,'Periodo',c('ano','mes'),sep='.')
head(df_original)


PeriodoDesemprego
2007.0810.4
2007.0910.5
2007.1010.0
2007.1110.0
2007.12 9.3
2008.01 9.3

In [ ]: