1 Leitura de Arquivos

1.1 Excel

install.packages("xlsx", repos = "http://cran.us.r-project.org")

library(xlsx)

res <- read.xlsx(arquivo, 1) # 1 corresponde ao número da Planilha que será lida

out <- write.xlsx(x = res, file="./dados/Novo_Arquivo.xlsx", sheetName = "Nova", showNA = FALSE)

1.2 Leitura de Arquivos Texto

# Sintaxe

read.table(file, header = FALSE, sep = "", quote = "\"'",
           dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
           row.names, col.names, as.is = !stringsAsFactors,
           na.strings = "NA", colClasses = NA, nrows = -1,
           skip = 0, check.names = TRUE, fill = !blank.lines.skip,
           strip.white = FALSE, blank.lines.skip = TRUE,
           comment.char = "#",
           allowEscapes = FALSE, flush = FALSE,
           stringsAsFactors = default.stringsAsFactors(),
           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

read.csv(file, header = TRUE, sep = ",", quote = "\"",
         dec = ".", fill = TRUE, comment.char = "", ...)

read.csv2(file, header = TRUE, sep = ";", quote = "\"",
          dec = ",", fill = TRUE, comment.char = "", ...)

read.delim(file, header = TRUE, sep = "\t", quote = "\"",
           dec = ".", fill = TRUE, comment.char = "", ...)

read.delim2(file, header = TRUE, sep = "\t", quote = "\"",
            dec = ",", fill = TRUE, comment.char = "", ...)
  • file: Nome do Arquivo
  • header: Primeira linha do arquivo corresponde ao cabeçalho
  • sep: separador
  • quote: aspas para separar caracteres
  • stringFactors: converte strings em Fatores

Exemplos:

dados <- read.table("arquivo.csv", header=TRUE, sep=",", row.names="id")

dados <- read.csv("arquivo.txt", header=T, dec=".",sep="\t")

dados <- read.csv2("arquivos.csv",
                header = FALSE,
                quote = "\"",
                dec = ",",
                row.names = c("M", "N", "O", "P", "Q"),
                col.names= c("X", "Y", "Z", "A","B"),
                stringsAsFactors=TRUE)

dados <- read.csv(
            file = "https://raw.githubusercontent.com/flaviobrito/dataudit/master/dados/Hospital.csv",
            sep = ";",
            stringsAsFactors = FALSE,
            na.strings = c("", " ")
  )  


dados  <- read.delim2("arquivo.txt",
                  header = FALSE,
                  sep = "\t",
                  quote  "\"",
                  dec = ".",
                  row.names = c("M", "N", "O"),
                  col.names= c("X", "Y", "Z", "A","B"),
                  colClasses = (rep("integer",2),
                                "date",
                                "numeric",
                                "character")
                  na.strings = "EMPTY",
                  skip = 2) # Pula as duas primeiras linhas antes de carregar


#Tamanho fixado

#Cria arquivo temporário
f <- tempfile()

#Dá saída da informação
cat("ID01Joao  M6.21970-01-01\nID02JaneteF5.61977-04-20\nID03Adao  M5.71979-05-13\n", file=f)

#Especificação dos campos por tamanho
d <- read.fwf(f, c(4,6,1,3,10))

# Apresenta a estrutura de d
str(d)

'data.frame':   3 obs. of  5 variables:
 $ V1: Factor w/ 3 levels "ID01","ID02",..: 1 2 3
 $ V2: Factor w/ 3 levels "Adao  ","Janete",..: 3 2 1
 $ V3: Factor w/ 2 levels "F","M": 2 1 2
 $ V4: num  6.2 5.6 5.7
 $ V5: Factor w/ 3 levels "1970-01-01","1977-04-20",..: 1 2 3

d

   V1     V2 V3  V4         V5
1 ID01 Joao    M 6.2 1970-01-01
2 ID02 Janete  F 5.6 1977-04-20
3 ID03 Adao    M 5.7 1979-05-13

2 Operações com Data Frame

getwd()
## [1] "C:/Users/flavi/OneDrive/Source/Repos/DataAudit"
setwd("./dados/")

Dados_A <- read.csv2("Dados_A.csv", sep=";",stringsAsFactors=FALSE, header = TRUE, na.strings = " ")

Dados_A
##   NUMFUNC NUMVINC SALARIO
## 1  102929       1    1000
## 2  109999       3    3000
## 3  102929       2      NA
## 4  119836       1     500
Dados_B <- read.csv2("Dados_B.csv", sep=";",stringsAsFactors=FALSE, header = TRUE, na.strings = " ")

Dados_B
##   NUMFUNC NUMVINC     SETOR
## 1  119836       1 SETOR_ABC
## 2  109999       3   SETOR_C

2.1 Arquivos / Data Frames

2.1.1 Merge

Como alguns nem sempre têm conhecimento o acesso a banco de dados, as operações abaixo são muito interessantes se comparadas com um JOIN (Banco de Dados).

Para conseguir a saída abaixo, digite:

m <- merge(Dados_A,Dados_B, all=TRUE)
m
##   NUMFUNC NUMVINC SALARIO     SETOR
## 1  102929       1    1000      <NA>
## 2  102929       2      NA      <NA>
## 3  109999       3    3000   SETOR_C
## 4  119836       1     500 SETOR_ABC

Para conseguir a saída abaixo, digite:

n <- merge(Dados_A,Dados_B, all.Dados_A=TRUE)
n
##   NUMFUNC NUMVINC SALARIO     SETOR
## 1  109999       3    3000   SETOR_C
## 2  119836       1     500 SETOR_ABC

Através desse comando indicamos ao R que o data frame Dados_A possui os campos de junção que devem ser respeitados.

O mesmo pode ser conseguido com o comando a seguir:

o <- merge(Dados_A,Dados_B, by = c("NUMFUNC","NUMVINC"))
o
##   NUMFUNC NUMVINC SALARIO     SETOR
## 1  109999       3    3000   SETOR_C
## 2  119836       1     500 SETOR_ABC

Para escolher um conjunto de saída específico utilizamos

p <- m[c("NUMFUNC","NUMVINC","SETOR")]
p
##   NUMFUNC NUMVINC     SETOR
## 1  102929       1      <NA>
## 2  102929       2      <NA>
## 3  109999       3   SETOR_C
## 4  119836       1 SETOR_ABC

c (“NUMFUNC”,”NUMVINC”,”SETOR”) – cria um vetor com esses 3 campos. Repare que m é um data frame:

Veja a estrutura de m com o comando:

str(m)
## 'data.frame':    4 obs. of  4 variables:
##  $ NUMFUNC: int  102929 102929 109999 119836
##  $ NUMVINC: int  1 2 3 1
##  $ SALARIO: int  1000 NA 3000 500
##  $ SETOR  : chr  NA NA "SETOR_C" "SETOR_ABC"

Para conseguir a saída abaixo,usaremos o seguinte comando:

q  <- merge(Dados_A,Dados_B, by = c("NUMFUNC"))
q
##   NUMFUNC NUMVINC.x SALARIO NUMVINC.y     SETOR
## 1  109999         3    3000         3   SETOR_C
## 2  119836         1     500         1 SETOR_ABC

Para conseguir a saída abaixo, digitaremos o seguinte comando:

u  <- merge(Dados_A,Dados_B, by = c("NUMVINC"))
u
##   NUMVINC NUMFUNC.x SALARIO NUMFUNC.y     SETOR
## 1       1    102929    1000    119836 SETOR_ABC
## 2       1    119836     500    119836 SETOR_ABC
## 3       3    109999    3000    109999   SETOR_C

Para conseguir a saída abaixo, usaremos o seguinte comando:

v  <-  merge(Dados_A,Dados_B, by=NULL)
v
##   NUMFUNC.x NUMVINC.x SALARIO NUMFUNC.y NUMVINC.y     SETOR
## 1    102929         1    1000    119836         1 SETOR_ABC
## 2    109999         3    3000    119836         1 SETOR_ABC
## 3    102929         2      NA    119836         1 SETOR_ABC
## 4    119836         1     500    119836         1 SETOR_ABC
## 5    102929         1    1000    109999         3   SETOR_C
## 6    109999         3    3000    109999         3   SETOR_C
## 7    102929         2      NA    109999         3   SETOR_C
## 8    119836         1     500    109999         3   SETOR_C
v  <-  merge(Dados_A,Dados_B, by="NUMFUNC", all.y=TRUE)
v
##   NUMFUNC NUMVINC.x SALARIO NUMVINC.y     SETOR
## 1  109999         3    3000         3   SETOR_C
## 2  119836         1     500         1 SETOR_ABC
v  <-  merge(Dados_A,Dados_B, by="NUMFUNC", all.x=TRUE)
v
##   NUMFUNC NUMVINC.x SALARIO NUMVINC.y     SETOR
## 1  102929         1    1000        NA      <NA>
## 2  102929         2      NA        NA      <NA>
## 3  109999         3    3000         3   SETOR_C
## 4  119836         1     500         1 SETOR_ABC

2.1.2 Append

A operação append une os dois data frames pelas linhas, colocando um após o outro. No exemplo abaixo temos 2 data frames com o mesmo número de colunas e todas do mesmo tipo. Desta forma faremos a operação de união destes em um outro data frame que chamaremos de “total”

total <- rbind(DADOS_A_JANEIRO, DADOS_A_FEVEREIRO) 

2.1.3 Melt (Derreter)

Esta operação modifica a distribuição de valores, trazendo colunas para linhas

id <- c(1,1,2,3)
time <- c(1,2,1,1)
x1 <- c(5,3,6,2)
x2 <- c(6,5,1,4)
df <- data.frame(id,time,x1,x2)
df
### Saída
 id time x1 x2
1  1    1  5  6
2  1    2  3  5
3  2    1  6  1
4  3    1  2  4

install.packages("reshape2")
library(reshape2)

novo_df <- melt(df, id=c("id","time")) 
novo_df

#Saída
  id time variable value
1  1    1       x1     5
2  1    2       x1     3
3  2    1       x1     6
4  3    1       x1     2
5  1    1       x2     6
6  1    2       x2     5
7  2    1       x2     1
8  3    1       x2     4

# Calculando com dados após melt

#Função cast

Sintaxe: dcast(data, formula, function) 

subj_medias <- dcast(novo_df, id~variable, mean)

subj_medias

id x1  x2
1  1  4 5.5
2  2  6 1.0
3  3  2 4.0

time_medias <- dcast(novo_df, time~variable, mean) 

time_medias

time       x1       x2
1    1 4.333333 3.666667
2    2 3.000000 5.000000

3 Transpondo

Transpõe uma matriz ou um data frame, mundando trocando o que é coluna or linha

t(mtcars)
#Saída
    Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout Valiant Duster 360
mpg      21.00        21.000      22.80         21.400             18.70   18.10      14.30
cyl       6.00         6.000       4.00          6.000              8.00    6.00       8.00
disp    160.00       160.000     108.00        258.000            360.00  225.00     360.00
hp      110.00       110.000      93.00        110.000            175.00  105.00     245.00
drat      3.90         3.900       3.85          3.080              3.15    2.76       3.21
wt        2.62         2.875       2.32          3.215              3.44    3.46       3.57

3.0.1 Combinando Conjuntos de dados

suppressMessages(library(dplyr))
x1 <- c("A", "B", "C")
x2 <- c(1,2,3)
a <- data.frame(x1,x2)

x1 <- c("A", "B", "C")
x3 <- c("T","F","T")
b <- data.frame(x1,x3)

3.0.1.1 Joins - Junções usando dplyr

left_join(a, b, by = "x1")
##   x1 x2 x3
## 1  A  1  T
## 2  B  2  F
## 3  C  3  T
right_join(a, b, by = "x1")
##   x1 x2 x3
## 1  A  1  T
## 2  B  2  F
## 3  C  3  T
inner_join(a, b, by = "x1")
##   x1 x2 x3
## 1  A  1  T
## 2  B  2  F
## 3  C  3  T
full_join(a, b, by = "x1")
##   x1 x2 x3
## 1  A  1  T
## 2  B  2  F
## 3  C  3  T
# Joins filtrados
semi_join(a, b, by = "x1") #Todas as linhas em a que tem uma coincidência em b
##   x1 x2
## 1  A  1
## 2  B  2
## 3  C  3
anti_join(a, b, by = "x1") #Todas as linhas em a que NÃO tem uma coincidência em b
## [1] x1 x2
## <0 rows> (or 0-length row.names)

3.0.1.2 Operações com Conjuntos

z <- NULL
x1 <- c("A", "B", "C")
x2 <- c(1,2,3)
y <- data.frame(x1,x2, stringsAsFactors = FALSE)

x1 <- as.character(c("B", "C", "D"))
x2 <- c(2,3,4)
z <- data.frame(x1,x2, stringsAsFactors = FALSE)

#Intercessão
intersect(y, z) #Linhas em comum em y e z
##   x1 x2
## 1  B  2
## 2  C  3
#União
union(y, z) # Linhas que aparecem em y e também em z
##   x1 x2
## 1  B  2
## 2  A  1
## 3  C  3
## 4  D  4
#Diferença
setdiff(y, z) # Linhas que aparecem em y e não em z
##   x1 x2
## 1  A  1

3.0.1.3 Usando Data frames

df1 <- data.frame(nome=c("SEPLAG", "SEFAZ", "SEEDUC"),bairro=c("CENTRO","CENTRO","CENTRO"), stringsAsFactors = FALSE)

print(df1)
##     nome bairro
## 1 SEPLAG CENTRO
## 2  SEFAZ CENTRO
## 3 SEEDUC CENTRO
df2 <- data.frame(nome=c("CECIERJ", "PRODERJ","SEEDUC"),bairro=c("GLORIA","GLORIA","CENTRO"), stringsAsFactors = FALSE)

print(df2)
##      nome bairro
## 1 CECIERJ GLORIA
## 2 PRODERJ GLORIA
## 3  SEEDUC CENTRO
#União
union(df1,df2)
##      nome bairro
## 1  SEPLAG CENTRO
## 2   SEFAZ CENTRO
## 3  SEEDUC CENTRO
## 4 CECIERJ GLORIA
## 5 PRODERJ GLORIA
#Interseção
intersect(df1,df2)
##     nome bairro
## 1 SEEDUC CENTRO
#Diferença
setdiff(df1,df2)
##     nome bairro
## 1 SEPLAG CENTRO
## 2  SEFAZ CENTRO

3.0.2 Filtros e Seleção de Registros e Atributos em Data Frames

suppressMessages(library(dplyr))


library(hflights)

flights <- hflights
dim(hflights)
## [1] 227496     21
head(hflights)
##      Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424 2011     1          1         6    1400    1500            AA
## 5425 2011     1          2         7    1401    1501            AA
## 5426 2011     1          3         1    1352    1502            AA
## 5427 2011     1          4         2    1403    1513            AA
## 5428 2011     1          5         3    1405    1507            AA
## 5429 2011     1          6         4    1359    1503            AA
##      FlightNum TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin
## 5424       428  N576AA                60      40      -10        0    IAH
## 5425       428  N557AA                60      45       -9        1    IAH
## 5426       428  N541AA                70      48       -8       -8    IAH
## 5427       428  N403AA                70      39        3        3    IAH
## 5428       428  N492AA                62      44       -3        5    IAH
## 5429       428  N262AA                64      45       -7       -1    IAH
##      Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 5424  DFW      224      7      13         0                         0
## 5425  DFW      224      6       9         0                         0
## 5426  DFW      224      5      17         0                         0
## 5427  DFW      224      9      22         0                         0
## 5428  DFW      224      9       9         0                         0
## 5429  DFW      224      6      13         0                         0
#Dados sobre o Data Frame hflights

#Número de Registros
nrow(flights)
## [1] 227496
#Número de Variávei
ncol(flights)
## [1] 21

3.0.3 Split - Dividindo Data frames

split(Dados_B, Dados_B$SETOR)
## $SETOR_ABC
##   NUMFUNC NUMVINC     SETOR
## 1  119836       1 SETOR_ABC
## 
## $SETOR_C
##   NUMFUNC NUMVINC   SETOR
## 2  109999       3 SETOR_C

3.0.4 Append Data frames - Anexando Data frames

rbind(Dados_A, Dados_A)
##   NUMFUNC NUMVINC SALARIO
## 1  102929       1    1000
## 2  109999       3    3000
## 3  102929       2      NA
## 4  119836       1     500
## 5  102929       1    1000
## 6  109999       3    3000
## 7  102929       2      NA
## 8  119836       1     500

4 Usando pacote Dplyr

4.1 Filtros e Seleções

Dplyr tem como objectivo proporcionar uma função para cada verbo base para manipulação de dados:

  • filter() (e slice())
  • arrange()
  • select() (e rename())
  • distinct()
  • mutate() (e transmute())
  • summarise()
  • sample_n() (e sample_frac())

4.1.1 Filtrando linhas usando filter()

filter () permite selecionar um subconjunto de linhas em um quadro de dados. O primeiro argumento é o nome do data frame. O segundo e subseqüentes argumentos são as expressões que filtram o data frame:

attach(flights)
filter(flights, Month == 1, DayofMonth == 1) %>%head
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1 2011     1          1         6    1400    1500            AA       428
## 2 2011     1          1         6     728     840            AA       460
## 3 2011     1          1         6    1631    1736            AA      1121
## 4 2011     1          1         6    1756    2112            AA      1294
## 5 2011     1          1         6    1012    1347            AA      1700
## 6 2011     1          1         6    1211    1325            AA      1820
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 1  N576AA                60      40      -10        0    IAH  DFW      224
## 2  N520AA                72      41        5        8    IAH  DFW      224
## 3  N4WVAA                65      37       -9        1    IAH  DFW      224
## 4  N3DGAA               136     113       -3        1    IAH  MIA      964
## 5  N3DAAA               155     117        7       -8    IAH  MIA      964
## 6  N593AA                74      39       15        6    IAH  DFW      224
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 1      7      13         0                         0
## 2      6      25         0                         0
## 3     16      12         0                         0
## 4      9      14         0                         0
## 5     12      26         0                         0
## 6      6      29         0                         0

Este é equivalente ao código mais detalhado na base de R:

flights[flights$Month == 1 & flights$DayofMonth == 1, ] %>%head
##       Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424  2011     1          1         6    1400    1500            AA
## 6343  2011     1          1         6     728     840            AA
## 19266 2011     1          1         6    1631    1736            AA
## 23655 2011     1          1         6    1756    2112            AA
## 33051 2011     1          1         6    1012    1347            AA
## 35256 2011     1          1         6    1211    1325            AA
##       FlightNum TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin
## 5424        428  N576AA                60      40      -10        0    IAH
## 6343        460  N520AA                72      41        5        8    IAH
## 19266      1121  N4WVAA                65      37       -9        1    IAH
## 23655      1294  N3DGAA               136     113       -3        1    IAH
## 33051      1700  N3DAAA               155     117        7       -8    IAH
## 35256      1820  N593AA                74      39       15        6    IAH
##       Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 5424   DFW      224      7      13         0                         0
## 6343   DFW      224      6      25         0                         0
## 19266  DFW      224     16      12         0                         0
## 23655  MIA      964      9      14         0                         0
## 33051  MIA      964     12      26         0                         0
## 35256  DFW      224      6      29         0                         0
# Método de assentamento para selecionar colunas e filtro UniqueCarrier e DepDisplay acima de 60 minutos

filter(select(flights, UniqueCarrier, DepDelay), DepDelay > 60) %>%head
##   UniqueCarrier DepDelay
## 1            AA       90
## 2            AA       67
## 3            AA       74
## 4            AA      125
## 5            AA       82
## 6            AA       99
# método de encadeamento
flights %>%
    select(UniqueCarrier, DepDelay) %>%
    filter(DepDelay > 60) %>%head
##   UniqueCarrier DepDelay
## 1            AA       90
## 2            AA       67
## 3            AA       74
## 4            AA      125
## 5            AA       82
## 6            AA       99

filter () funciona de forma semelhante para o subconjunto () exceto que você pode dar qualquer número de condições de filtragem, que são unidas em conjunto com & (não && que é fácil de fazer acidentalmente!). Você também pode usar outros operadores booleanos:

filter(flights, Month == 1 | Month == 2) %>%head
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1 2011     1          1         6    1400    1500            AA       428
## 2 2011     1          2         7    1401    1501            AA       428
## 3 2011     1          3         1    1352    1502            AA       428
## 4 2011     1          4         2    1403    1513            AA       428
## 5 2011     1          5         3    1405    1507            AA       428
## 6 2011     1          6         4    1359    1503            AA       428
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 1  N576AA                60      40      -10        0    IAH  DFW      224
## 2  N557AA                60      45       -9        1    IAH  DFW      224
## 3  N541AA                70      48       -8       -8    IAH  DFW      224
## 4  N403AA                70      39        3        3    IAH  DFW      224
## 5  N492AA                62      44       -3        5    IAH  DFW      224
## 6  N262AA                64      45       -7       -1    IAH  DFW      224
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 1      7      13         0                         0
## 2      6       9         0                         0
## 3      5      17         0                         0
## 4      9      22         0                         0
## 5      9       9         0                         0
## 6      6      13         0                         0
# Para selecionar linhas de posição, o uso slice ():

slice(flights, 1:10) %>%head
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1 2011     1          1         6    1400    1500            AA       428
## 2 2011     1          2         7    1401    1501            AA       428
## 3 2011     1          3         1    1352    1502            AA       428
## 4 2011     1          4         2    1403    1513            AA       428
## 5 2011     1          5         3    1405    1507            AA       428
## 6 2011     1          6         4    1359    1503            AA       428
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 1  N576AA                60      40      -10        0    IAH  DFW      224
## 2  N557AA                60      45       -9        1    IAH  DFW      224
## 3  N541AA                70      48       -8       -8    IAH  DFW      224
## 4  N403AA                70      39        3        3    IAH  DFW      224
## 5  N492AA                62      44       -3        5    IAH  DFW      224
## 6  N262AA                64      45       -7       -1    IAH  DFW      224
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 1      7      13         0                         0
## 2      6       9         0                         0
## 3      5      17         0                         0
## 4      9      22         0                         0
## 5      9       9         0                         0
## 6      6      13         0                         0

``` ###Arrange rows with arrange()

Arrange() funciona da mesma forma que o filter(), exceto que em vez de filtragem ou linhas selecionando, que reordena-los. É preciso um data frame, e um conjunto de nomes de colunas (ou expressões mais complicadas) para ordenar por. Se você fornecer mais de um nome de coluna, cada coluna adicional será usada para quebrar os laços nos valores das colunas precedentes:

arrange(flights, Year, Month, DayofMonth) %>%head
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1 2011     1          1         6    1400    1500            AA       428
## 2 2011     1          1         6     728     840            AA       460
## 3 2011     1          1         6    1631    1736            AA      1121
## 4 2011     1          1         6    1756    2112            AA      1294
## 5 2011     1          1         6    1012    1347            AA      1700
## 6 2011     1          1         6    1211    1325            AA      1820
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 1  N576AA                60      40      -10        0    IAH  DFW      224
## 2  N520AA                72      41        5        8    IAH  DFW      224
## 3  N4WVAA                65      37       -9        1    IAH  DFW      224
## 4  N3DGAA               136     113       -3        1    IAH  MIA      964
## 5  N3DAAA               155     117        7       -8    IAH  MIA      964
## 6  N593AA                74      39       15        6    IAH  DFW      224
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 1      7      13         0                         0
## 2      6      25         0                         0
## 3     16      12         0                         0
## 4      9      14         0                         0
## 5     12      26         0                         0
## 6      6      29         0                         0
# Base de abordagem R para selecionar UniqueCarrier e DepDelay e classificar por DepDelay

arrange(flights, DepDelay, UniqueCarrier, DepDelay) %>%head
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1 2011    12         24         6    1112    1314            OO      5440
## 2 2011     2         14         1    1917    2027            MQ      3328
## 3 2011     4         10         7    2101    2206            XE      2669
## 4 2011     8          3         3    1741    1810            XE      2603
## 5 2011     1         18         2    1542    1936            CO      1688
## 6 2011    10          4         2    1438    1813            EV      5412
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 1  N728SK               182     131      -25      -33    IAH  ASE      913
## 2  N648MQ                70      49      -23      -23    HOU  DFW      247
## 3  N13908                65      44      -12      -19    IAH  DFW      224
## 4  N11107                89      73      -40      -19    IAH  HOB      501
## 5  N27610               174     139      -17      -18    IAH  DTW     1076
## 6  N134EV               155     139      -31      -18    IAH  DTW     1075
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 1      3      48         0                         0
## 2     10      11         0                         0
## 3      6      15         0                         0
## 4      5      11         0                         0
## 5      7      28         0                         0
## 6      4      12         0                         0
#ou método de encadeamento

flights %>%
    select(UniqueCarrier, DepDelay) %>%
    arrange(DepDelay) %>% head
##   UniqueCarrier DepDelay
## 1            OO      -33
## 2            MQ      -23
## 3            XE      -19
## 4            XE      -19
## 5            CO      -18
## 6            EV      -18
# Use desc () para ordenar uma coluna em ordem decrescente:
arrange(flights, desc(ArrDelay)) %>%head
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1 2011    12         12         1     650     808            AA      1740
## 2 2011     8          1         1     156     452            CO         1
## 3 2011    11          8         2     721     948            MQ      3786
## 4 2011     6         21         2    2334     124            UA       855
## 5 2011     5         20         5     858    1027            MQ      3328
## 6 2011     6          9         4    2029    2243            MQ      3859
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 1  N473AA                78      49      978      970    IAH  DFW      224
## 2  N69063               476     461      957      981    IAH  HNL     3904
## 3  N502MQ               147     120      918      931    IAH  ORD      925
## 4  N670UA               230     216      861      869    IAH  SFO     1635
## 5  N609MQ                89      55      822      803    HOU  DFW      247
## 6  N6EAMQ               134     117      793      814    IAH  ORD      925
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 1     14      15         0                         0
## 2      5      10         0                         0
## 3      9      18         0                         0
## 4      3      11         0                         0
## 5     10      24         0                         0
## 6      9       8         0                         0
#ou pelo método de cadeia

flights %>%
    select(UniqueCarrier, DepDelay) %>%
    arrange(desc(DepDelay)) %>%head
##   UniqueCarrier DepDelay
## 1            CO      981
## 2            AA      970
## 3            MQ      931
## 4            UA      869
## 5            MQ      814
## 6            MQ      803

O código anterior é equivalente a:

flights[order(flights$Year, flights$Month, flights$DayofMonth), ] %>%head
##       Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424  2011     1          1         6    1400    1500            AA
## 6343  2011     1          1         6     728     840            AA
## 19266 2011     1          1         6    1631    1736            AA
## 23655 2011     1          1         6    1756    2112            AA
## 33051 2011     1          1         6    1012    1347            AA
## 35256 2011     1          1         6    1211    1325            AA
##       FlightNum TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin
## 5424        428  N576AA                60      40      -10        0    IAH
## 6343        460  N520AA                72      41        5        8    IAH
## 19266      1121  N4WVAA                65      37       -9        1    IAH
## 23655      1294  N3DGAA               136     113       -3        1    IAH
## 33051      1700  N3DAAA               155     117        7       -8    IAH
## 35256      1820  N593AA                74      39       15        6    IAH
##       Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 5424   DFW      224      7      13         0                         0
## 6343   DFW      224      6      25         0                         0
## 19266  DFW      224     16      12         0                         0
## 23655  MIA      964      9      14         0                         0
## 33051  MIA      964     12      26         0                         0
## 35256  DFW      224      6      29         0                         0
flights[order(flights$ArrDelay, decreasing = TRUE), ] %>%head #ou
##         Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5622757 2011    12         12         1     650     808            AA
## 4086711 2011     8          1         1     156     452            CO
## 5457943 2011    11          8         2     721     948            MQ
## 2843667 2011     6         21         2    2334     124            UA
## 2479980 2011     5         20         5     858    1027            MQ
## 3016449 2011     6          9         4    2029    2243            MQ
##         FlightNum TailNum ActualElapsedTime AirTime ArrDelay DepDelay
## 5622757      1740  N473AA                78      49      978      970
## 4086711         1  N69063               476     461      957      981
## 5457943      3786  N502MQ               147     120      918      931
## 2843667       855  N670UA               230     216      861      869
## 2479980      3328  N609MQ                89      55      822      803
## 3016449      3859  N6EAMQ               134     117      793      814
##         Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode
## 5622757    IAH  DFW      224     14      15         0                 
## 4086711    IAH  HNL     3904      5      10         0                 
## 5457943    IAH  ORD      925      9      18         0                 
## 2843667    IAH  SFO     1635      3      11         0                 
## 2479980    HOU  DFW      247     10      24         0                 
## 3016449    IAH  ORD      925      9       8         0                 
##         Diverted
## 5622757        0
## 4086711        0
## 5457943        0
## 2843667        0
## 2479980        0
## 3016449        0
flights[order(-flights$ArrDelay), ] %>%head
##         Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5622757 2011    12         12         1     650     808            AA
## 4086711 2011     8          1         1     156     452            CO
## 5457943 2011    11          8         2     721     948            MQ
## 2843667 2011     6         21         2    2334     124            UA
## 2479980 2011     5         20         5     858    1027            MQ
## 3016449 2011     6          9         4    2029    2243            MQ
##         FlightNum TailNum ActualElapsedTime AirTime ArrDelay DepDelay
## 5622757      1740  N473AA                78      49      978      970
## 4086711         1  N69063               476     461      957      981
## 5457943      3786  N502MQ               147     120      918      931
## 2843667       855  N670UA               230     216      861      869
## 2479980      3328  N609MQ                89      55      822      803
## 3016449      3859  N6EAMQ               134     117      793      814
##         Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode
## 5622757    IAH  DFW      224     14      15         0                 
## 4086711    IAH  HNL     3904      5      10         0                 
## 5457943    IAH  ORD      925      9      18         0                 
## 2843667    IAH  SFO     1635      3      11         0                 
## 2479980    HOU  DFW      247     10      24         0                 
## 3016449    IAH  ORD      925      9       8         0                 
##         Diverted
## 5622757        0
## 4086711        0
## 5457943        0
## 2843667        0
## 2479980        0
## 3016449        0

4.1.2 Selecionar colunas com select ()

Muitas vezes você trabalhar com grandes conjuntos de dados com muitas colunas, mas apenas alguns são realmente de interesse para você. select() permite-lhe ampliar rapidamente em um subconjunto útil usando operações que normalmente só funcionam em posições variáveis numéricas:

select(flights, DepTime, ArrTime, FlightNum) %>%head
##      DepTime ArrTime FlightNum
## 5424    1400    1500       428
## 5425    1401    1501       428
## 5426    1352    1502       428
## 5427    1403    1513       428
## 5428    1405    1507       428
## 5429    1359    1503       428
select(flights, Year, Month, DayofMonth) %>%head
##      Year Month DayofMonth
## 5424 2011     1          1
## 5425 2011     1          2
## 5426 2011     1          3
## 5427 2011     1          4
## 5428 2011     1          5
## 5429 2011     1          6
select(flights, Year:DayofMonth) %>%head
##      Year Month DayofMonth
## 5424 2011     1          1
## 5425 2011     1          2
## 5426 2011     1          3
## 5427 2011     1          4
## 5428 2011     1          5
## 5429 2011     1          6
select(flights, -(Year:DayofMonth)) %>%head
##      DayOfWeek DepTime ArrTime UniqueCarrier FlightNum TailNum
## 5424         6    1400    1500            AA       428  N576AA
## 5425         7    1401    1501            AA       428  N557AA
## 5426         1    1352    1502            AA       428  N541AA
## 5427         2    1403    1513            AA       428  N403AA
## 5428         3    1405    1507            AA       428  N492AA
## 5429         4    1359    1503            AA       428  N262AA
##      ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 5424                60      40      -10        0    IAH  DFW      224
## 5425                60      45       -9        1    IAH  DFW      224
## 5426                70      48       -8       -8    IAH  DFW      224
## 5427                70      39        3        3    IAH  DFW      224
## 5428                62      44       -3        5    IAH  DFW      224
## 5429                64      45       -7       -1    IAH  DFW      224
##      TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 5424      7      13         0                         0
## 5425      6       9         0                         0
## 5426      5      17         0                         0
## 5427      9      22         0                         0
## 5428      9       9         0                         0
## 5429      6      13         0                         0
#Seleciona somente as variáveis cujo nome contem o texto especificado

select(flights, Year:DayofMonth, contains("Taxi"), contains("Delay")) %>% head
##      Year Month DayofMonth TaxiIn TaxiOut ArrDelay DepDelay
## 5424 2011     1          1      7      13      -10        0
## 5425 2011     1          2      6       9       -9        1
## 5426 2011     1          3      5      17       -8       -8
## 5427 2011     1          4      9      22        3        3
## 5428 2011     1          5      9       9       -3        5
## 5429 2011     1          6      6      13       -7       -1
# Você pode renomear variáveis com select () usando argumentos nomeados:

select(flights, tail_num = TailNum) %>%head
##      tail_num
## 5424   N576AA
## 5425   N557AA
## 5426   N541AA
## 5427   N403AA
## 5428   N492AA
## 5429   N262AA
# Mas porque select() elimina todas as variáveis não explicitamente mencionadas, não é assim tão útil. Em vez disso, o uso rename():

rename(flights, tail_num = TailNum) %>%head
##      Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier
## 5424 2011     1          1         6    1400    1500            AA
## 5425 2011     1          2         7    1401    1501            AA
## 5426 2011     1          3         1    1352    1502            AA
## 5427 2011     1          4         2    1403    1513            AA
## 5428 2011     1          5         3    1405    1507            AA
## 5429 2011     1          6         4    1359    1503            AA
##      FlightNum tail_num ActualElapsedTime AirTime ArrDelay DepDelay Origin
## 5424       428   N576AA                60      40      -10        0    IAH
## 5425       428   N557AA                60      45       -9        1    IAH
## 5426       428   N541AA                70      48       -8       -8    IAH
## 5427       428   N403AA                70      39        3        3    IAH
## 5428       428   N492AA                62      44       -3        5    IAH
## 5429       428   N262AA                64      45       -7       -1    IAH
##      Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted
## 5424  DFW      224      7      13         0                         0
## 5425  DFW      224      6       9         0                         0
## 5426  DFW      224      5      17         0                         0
## 5427  DFW      224      9      22         0                         0
## 5428  DFW      224      9       9         0                         0
## 5429  DFW      224      6      13         0                         0

4.1.3 Extraia linhas distintas (únicas)

Use distinct () para encontrar valores exclusivos em uma tabela:

distinct(flights, TailNum) %>%head
##   TailNum
## 1  N576AA
## 2  N557AA
## 3  N541AA
## 4  N403AA
## 5  N492AA
## 6  N262AA
distinct(flights, Origin, Dest=="GIG") %>%head
##   Origin Dest == "GIG"
## 1    IAH         FALSE
## 2    HOU         FALSE

4.1.4 Adicionar novas colunas com mutate()

Além de selecionar conjuntos de colunas existentes, muitas vezes é útil para adicionar novas colunas que são funções de colunas existentes. Este é o trabalho de mutate ():

mutate(flights,
  gain = ArrDelay - DepDelay,
  speed = Distance / AirTime * 60) %>%head
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1 2011     1          1         6    1400    1500            AA       428
## 2 2011     1          2         7    1401    1501            AA       428
## 3 2011     1          3         1    1352    1502            AA       428
## 4 2011     1          4         2    1403    1513            AA       428
## 5 2011     1          5         3    1405    1507            AA       428
## 6 2011     1          6         4    1359    1503            AA       428
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 1  N576AA                60      40      -10        0    IAH  DFW      224
## 2  N557AA                60      45       -9        1    IAH  DFW      224
## 3  N541AA                70      48       -8       -8    IAH  DFW      224
## 4  N403AA                70      39        3        3    IAH  DFW      224
## 5  N492AA                62      44       -3        5    IAH  DFW      224
## 6  N262AA                64      45       -7       -1    IAH  DFW      224
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted gain    speed
## 1      7      13         0                         0  -10 336.0000
## 2      6       9         0                         0  -10 298.6667
## 3      5      17         0                         0    0 280.0000
## 4      9      22         0                         0    0 344.6154
## 5      9       9         0                         0   -8 305.4545
## 6      6      13         0                         0   -6 298.6667
# A abordagem com dplyr (imprime a nova variável, mas não a armazena)
flights %>%
    select(Distance, AirTime) %>%
    mutate(Speed = Distance/AirTime*60) %>%head
##   Distance AirTime    Speed
## 1      224      40 336.0000
## 2      224      45 298.6667
## 3      224      48 280.0000
## 4      224      39 344.6154
## 5      224      44 305.4545
## 6      224      45 298.6667
# Armazena uma nova variável
flights <- flights %>% mutate(Speed = Distance/AirTime*60) %>%head

A principal diferença entre a mutate () e transform () é que mutate() permite que você se referira as colunas que você acabou de criar:

mutate(flights,
  gain = ArrDelay - DepDelay,
  gain_per_hour = gain / (AirTime / 60) %>%head
)
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1 2011     1          1         6    1400    1500            AA       428
## 2 2011     1          2         7    1401    1501            AA       428
## 3 2011     1          3         1    1352    1502            AA       428
## 4 2011     1          4         2    1403    1513            AA       428
## 5 2011     1          5         3    1405    1507            AA       428
## 6 2011     1          6         4    1359    1503            AA       428
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 1  N576AA                60      40      -10        0    IAH  DFW      224
## 2  N557AA                60      45       -9        1    IAH  DFW      224
## 3  N541AA                70      48       -8       -8    IAH  DFW      224
## 4  N403AA                70      39        3        3    IAH  DFW      224
## 5  N492AA                62      44       -3        5    IAH  DFW      224
## 6  N262AA                64      45       -7       -1    IAH  DFW      224
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted    Speed gain
## 1      7      13         0                         0 336.0000  -10
## 2      6       9         0                         0 298.6667  -10
## 3      5      17         0                         0 280.0000    0
## 4      9      22         0                         0 344.6154    0
## 5      9       9         0                         0 305.4545   -8
## 6      6      13         0                         0 298.6667   -6
##   gain_per_hour
## 1     -15.00000
## 2     -13.33333
## 3       0.00000
## 4       0.00000
## 5     -10.90909
## 6      -8.00000
#Deverá gerar um erro

Se você só quer manter as novas variáveis, utilize transmute():

transmute(flights,
  gain = ArrDelay - DepDelay,
  gain_per_hour = gain / (AirTime / 60)
 ) %>%head
##   gain gain_per_hour
## 1  -10     -15.00000
## 2  -10     -13.33333
## 3    0       0.00000
## 4    0       0.00000
## 5   -8     -10.90909
## 6   -6      -8.00000

4.1.5 Totalize valores com summarise()

O último verbo é summarise(). Ele recolhe um data frame a uma única linha (este é exatamente equivalente a plyr :: summarise ()) group_by cria os grupos que serão operados. summarise utiliza a função de agregação fornecida para resumir cada grupo.

summarise(flights,
  delay = mean(DepDelay, na.rm = TRUE))
##   delay
## 1     0

4.1.6 Amostras - randomicamente selecione amostras com sample_n() e sample_frac()

Você pode utilizar sample_n() and sample_frac() para gerar uma amostra aleatória de registros: utilize sample_n() para um número fixo e sample_frac() para uma fração fixa.

sample_n(flights, 5)
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 2 2011     1          2         7    1401    1501            AA       428
## 4 2011     1          4         2    1403    1513            AA       428
## 6 2011     1          6         4    1359    1503            AA       428
## 5 2011     1          5         3    1405    1507            AA       428
## 3 2011     1          3         1    1352    1502            AA       428
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 2  N557AA                60      45       -9        1    IAH  DFW      224
## 4  N403AA                70      39        3        3    IAH  DFW      224
## 6  N262AA                64      45       -7       -1    IAH  DFW      224
## 5  N492AA                62      44       -3        5    IAH  DFW      224
## 3  N541AA                70      48       -8       -8    IAH  DFW      224
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted    Speed
## 2      6       9         0                         0 298.6667
## 4      9      22         0                         0 344.6154
## 6      6      13         0                         0 298.6667
## 5      9       9         0                         0 305.4545
## 3      5      17         0                         0 280.0000
sample_frac(flights, 0.01)
##  [1] Year              Month             DayofMonth       
##  [4] DayOfWeek         DepTime           ArrTime          
##  [7] UniqueCarrier     FlightNum         TailNum          
## [10] ActualElapsedTime AirTime           ArrDelay         
## [13] DepDelay          Origin            Dest             
## [16] Distance          TaxiIn            TaxiOut          
## [19] Cancelled         CancellationCode  Diverted         
## [22] Speed            
## <0 rows> (or 0-length row.names)

Use replace = TRUE para executar uma amostra de bootstrap. Se necessário, você pode pesar a amostra com o argumento de peso.

4.1.7 Operações Agrupadas

#A abordagem com dplyr: criar uma tabela agrupados por Dest, e depois resumir cada grupo tomando a média de ArrDelay

flights %>%
    group_by(Dest) %>%
    summarise(avg_delay = mean(ArrDelay, na.rm=TRUE))
## # A tibble: 1 × 2
##    Dest avg_delay
##   <chr>     <dbl>
## 1   DFW -5.666667
# Para cada operadora, calcule o atraso máximo e mínimo em partidas e chegadas
flights %>%
    group_by(UniqueCarrier) %>%
    summarise_each(funs(min(., na.rm=TRUE), max(., na.rm=TRUE)), matches("Delay"))
## # A tibble: 1 × 5
##   UniqueCarrier ArrDelay_min DepDelay_min ArrDelay_max DepDelay_max
##           <chr>        <int>        <int>        <int>        <int>
## 1            AA          -10           -8            3            5
#A função n () conta o número de linhas em um grupo
#A função n_distinct (vector) conta o número de itens exclusivos nesse vector

# Para cada dia do ano, contar o número total de voos, e classificar em ordem decrescente

flights %>%
    group_by(Month, DayofMonth) %>%
    summarise(flight_count = n()) %>%
    arrange(desc(flight_count))
## Source: local data frame [6 x 3]
## Groups: Month [1]
## 
##   Month DayofMonth flight_count
##   <int>      <int>        <int>
## 1     1          1            1
## 2     1          2            1
## 3     1          3            1
## 4     1          4            1
## 5     1          5            1
## 6     1          6            1
# Para cada destino, contar o número total de voos eo número de planos distintos que voavam lá

flights %>%
    group_by(Dest) %>%
    summarise(flight_count = n(), plane_count = n_distinct(TailNum)) 
## # A tibble: 1 × 3
##    Dest flight_count plane_count
##   <chr>        <int>       <int>
## 1   DFW            6           6
# Para cada destino, mostram o número de vôos cancelados e Não cancelada

flights %>%
    group_by(Dest) %>%
    select(Cancelled) %>%
    table() %>%head
## Adding missing grouping variables: `Dest`
##      Cancelled
## Dest  0
##   DFW 6

4.1.8 Funções Janela

função de aggregate (como média) tem n entradas e retorna 1 valor Função de janela tem n entradas e retorna n valores

Inclui funções de ranking e ordenação (como min_rank), compensado funções (lead e lag), e agregações acumuladas (como cummean).

by_tailnum <- group_by(flights, TailNum)
delay <- summarise(by_tailnum,
  count = n(),
  dist = mean(Distance, na.rm = TRUE),
  delay = mean(ArrDelay, na.rm = TRUE))

delay <- filter(delay, count > 20, dist < 2000)

# Para cada operadora, calcule qual dos dois dias do ano eles tinham seus maiores atrasos de partida.

# Nota: O valor menor (e não maior)  é classificado como 1, então você tem que usar "desc" para classificar pelo maior valor

#2 para cada grupo
flights %>%
    group_by(UniqueCarrier) %>%
    select(Month, DayofMonth, DepDelay) %>%
    filter(min_rank(desc(DepDelay)) <= 2) %>%
    arrange(UniqueCarrier, desc(DepDelay)) %>%head
## Adding missing grouping variables: `UniqueCarrier`
## Source: local data frame [2 x 4]
## Groups: UniqueCarrier [1]
## 
##   UniqueCarrier Month DayofMonth DepDelay
##           <chr> <int>      <int>    <int>
## 1            AA     1          5        5
## 2            AA     1          4        3
# Reescrito de maneira mais simples usando a função top_n

flights %>%
    group_by(UniqueCarrier) %>%
    select(Month, DayofMonth, DepDelay) %>%
    top_n(2) %>%
    arrange(UniqueCarrier, desc(DepDelay)) %>%head
## Adding missing grouping variables: `UniqueCarrier`
## Selecting by DepDelay
## Source: local data frame [2 x 4]
## Groups: UniqueCarrier [1]
## 
##   UniqueCarrier Month DayofMonth DepDelay
##           <chr> <int>      <int>    <int>
## 1            AA     1          5        5
## 2            AA     1          4        3

4.1.9 Top - Maiores valores

# Maiores Atrasos na Partida
top_n(flights, 2, flights$DepDelay)
##   Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
## 1 2011     1          4         2    1403    1513            AA       428
## 2 2011     1          5         3    1405    1507            AA       428
##   TailNum ActualElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance
## 1  N403AA                70      39        3        3    IAH  DFW      224
## 2  N492AA                62      44       -3        5    IAH  DFW      224
##   TaxiIn TaxiOut Cancelled CancellationCode Diverted    Speed
## 1      9      22         0                         0 344.6154
## 2      9       9         0                         0 305.4545

4.1.10 Primeiro Registro

first(flights$Distance)
## [1] 224