February 6, 2018 · R
A Day With R
Datatypes
- A
vector
is always homogenous - A
list
can be heterogenous - A
matrix
is a list of vectors - A
dataframe
is a list of lists.
stockprice <- 1900L
class(stockprice)
stocks <- c("HEG", "Graphite", "Bajaj", "L&T")
prices <- c(1900L, 650L, 500L, 1380L)
names(stocks) <- c("Carbon", "Carbon", "Auto", "Infra")
isAuto <- TRUE
isAuto <- FALSE
data = factor(names(stocks))
mat1 <- matrix(c(1:10), nrow=2)
mat1 <- matrix(c(1:40), nrow=4)
p <- c(6,8,10)
p1 <- list(6,8,10)
p2 <- list(c(6,8,10))
Vector of numeric values
p <- c(6,8,10)
> p
[1] 6 8 10
>
> for (i in 1:length(p)) {
+ print(p[[i]]*2)
+ }
[1] 12
[1] 16
[1] 20
>
List of vector of 3 elems
p1 <- list(6,8,10)
> p1
[[1]]
[1] 6
[[2]]
[1] 8
[[3]]
[1] 10
> for (each in p1) {
+ print(each*2)
+ }
[1] 12
[1] 16
[1] 20
>
List of vector of one elem which is also a list
p2 <- list(c(6,8,10))
> p2
[[1]]
[1] 6 8 10
> for (i in 1:length(p2[[1]])) {
+ print(p2[[1]][i]*2)
+ }
[1] 12
[1] 16
[1] 20
>
lapply
- output is always a list
> mul <- function(x){x*2}
> p
[1] 6 8 10
> lapply(p, mul)
[[1]]
[1] 12
[[2]]
[1] 16
[[3]]
[1] 20
> p1
[[1]]
[1] 6
[[2]]
[1] 8
[[3]]
[1] 10
> lapply(p1, mul)
[[1]]
[1] 12
[[2]]
[1] 16
[[3]]
[1] 20
> unlist(lapply(p1, mul))
[1] 12 16 20
sapply
- Good for reporting.
- Needs high level of confidence in data structures used.
- Output can be vector or matrix or list
> mul <- function(x){x*2}
> p
[1] 6 8 10
> sapply(p, mul)
[1] 12 16 20
> p1
[[1]]
[1] 6
[[2]]
[1] 8
[[3]]
[1] 10
> sapply(p1, mul)
[1] 12 16 20
> p2
[[1]]
[1] 6 8 10
> sapply(p2, mul)
[,1]
[1,] 12
[2,] 16
[3,] 20
vapply
- Verify apply
- Verifies if the return type of the function matches with the last arg
> mul <- function(x){x*2}
> p
[1] 6 8 10
> vapply(p, mul, numeric(1))
[1] 12 16 20
> p
[1] 6 8 10
> vapply(p, mul, numeric(2))
Error in vapply(p, mul, numeric(2)) : values must be length 2,
but FUN(X[[1]]) result is length 1
> p
[1] 6 8 10
> vapply(p, mul, character(1))
Error in vapply(p, mul, character(1)) : values must be type 'character',
but FUN(X[[1]]) result is type 'double'
>
tapply
- split, apply, combine
- group_by and for each group do a task
- outputs an array
- tapply can have only one y variable, multiple x variables. i.e. mean sepal length for multiple species.
- aggregate can also be used for the same purpose
- aggregate gives data frame as output
- aggregate can have multiple x and multiple y variables. i.e. sales and profit number for multiple companies.
Exercise #1
- Q - From a given list of names print the min and max char in every name in a report format.
- The below also demonstrates the difference between lapply and sapply.
> names <- c("Ankur", "Ganesan", "Bhargavi", "pankaj", "Vivek", "Srikrishnan")
> firstlast <- function(x) {
+ s <- strsplit(x, "")[[1]]
+ return(c(first=min(s), last=max(s)))
+
+ }
> lapply(names, firstlast)
[[1]]
first last
"A" "u"
[[2]]
first last
"G" "s"
[[3]]
first last
"B" "v"
[[4]]
first last
"a" "p"
[[5]]
first last
"V" "v"
[[6]]
first last
"S" "s"
> class(lapply(names, firstlast))
[1] "list"
>
> sapply(names, firstlast)
Ankur Ganesan Bhargavi pankaj Vivek Srikrishnan
first "A" "G" "B" "a" "V" "S"
last "u" "s" "v" "p" "v" "s"
>
> class(sapply(names, firstlast))
[1] "matrix"
Exercise #2
- Q - from a given list of names print only the unique characters per name
> names <- c("ankur", "ganesan", "bhargavi", "pankaj", "vivek", "srikrishnan")
> uniquenames <- function(x) {
+ s <- strsplit(x, "")[[1]]
+ return(unique(s))
+ }
> sapply(names, uniquenames)
$ankur
[1] "a" "n" "k" "u" "r"
$ganesan
[1] "g" "a" "n" "e" "s"
$bhargavi
[1] "b" "h" "a" "r" "g" "v" "i"
$pankaj
[1] "p" "a" "n" "k" "j"
$vivek
[1] "v" "i" "e" "k"
$srikrishnan
[1] "s" "r" "i" "k" "h" "n" "a"
>
Tidy the data
- We use
reshape2
andtidyr
libraries here. reshape2
provides us themelt
method that will help us convert data from report format to a more program friendly format.tidyr
provides us with thegather
API, this does exactly the same thing asmelt
- In the below example we hav religions as rows and salary ranges as columns.
- To convert it to tidy data we need to stack religion:salary_range as rows.
- Tidy data allows for easy operation on the dataset - like groupby, filter etc.
> setwd("/Users/vvb/work/projects/datascience")
> getwd()
[1] "/Users/vvb/work/projects/datascience"
> rawdata <- read.csv("pew.csv", check.names = F, encoding = "UTF-8")
> head(rawdata)
religion <$10k $10-20k $20-30k $30-40k $40-50k $50-75k $75-100k $100-150k >150k Don't know/refused
1 Agnostic 27 34 60 81 76 137 122 109 84 96
2 Atheist 12 27 37 52 35 70 73 59 74 76
3 Buddhist 27 21 30 34 33 58 62 39 53 54
4 Catholic 418 617 732 670 638 1116 949 792 633 1489
5 Don<U+2019>t know/refused 15 14 15 11 10 35 21 17 18 116
6 Evangelical Prot 575 869 1064 982 881 1486 949 723 414 1529
> library(reshape2)
> library(tidyr)
> tidydata <- rawdata %>%
+ melt(id= "religion",
+ variable.name = "salary",
+ value.name = "count")
> head(tidydata)
religion salary count
1 Agnostic <$10k 27
2 Atheist <$10k 12
3 Buddhist <$10k 27
4 Catholic <$10k 418
5 Don<U+2019>t know/refused <$10k 15
6 Evangelical Prot <$10k 575
> tidydata2 <- rawdata %>%
+ gather(2:11,
+ key = "salary",
+ value = "count")
> head(tidydata2)
religion salary count
1 Agnostic <$10k 27
2 Atheist <$10k 12
3 Buddhist <$10k 27
4 Catholic <$10k 418
5 Don<U+2019>t know/refused <$10k 15
6 Evangelical Prot <$10k 575
>
- Below is the min and max temperature data for various (year, month, day) pairs.
- We need to transform this to a
year:month:day
as row format. - Note that id can be a list of columns -
c("year", "month", "element")
where element istemp_max/temp_min
> rawdata1 <- read.delim("weather.txt", check.names = F, na.strings = '.')
> head(rawdata1)
year month element 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
1 2010 1 tmax NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 278 NA
2 2010 1 tmin NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 145 NA
3 2010 2 tmax NA 273 241 NA NA NA NA NA NA NA 297 NA NA NA NA NA NA NA NA NA NA NA 299 NA NA NA NA NA NA NA NA
4 2010 2 tmin NA 144 144 NA NA NA NA NA NA NA 134 NA NA NA NA NA NA NA NA NA NA NA 107 NA NA NA NA NA NA NA NA
5 2010 3 tmax NA NA NA NA 321 NA NA NA NA 345 NA NA NA NA NA 311 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
6 2010 3 tmin NA NA NA NA 142 NA NA NA NA 168 NA NA NA NA NA 176 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> str(rawdata1)
'data.frame': 22 obs. of 34 variables:
$ year : int 2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
$ month : int 1 1 2 2 3 3 4 4 5 5 ...
$ element: Factor w/ 2 levels "tmax","tmin": 1 2 1 2 1 2 1 2 1 2 ...
$ 1 : int NA NA NA NA NA NA NA NA NA NA ...
$ 2 : int NA NA 273 144 NA NA NA NA NA NA ...
$ 3 : int NA NA 241 144 NA NA NA NA NA NA ...
$ 4 : int NA NA NA NA NA NA NA NA NA NA ...
$ 5 : int NA NA NA NA 321 142 NA NA NA NA ...
$ 6 : int NA NA NA NA NA NA NA NA NA NA ...
$ 7 : int NA NA NA NA NA NA NA NA NA NA ...
$ 8 : int NA NA NA NA NA NA NA NA NA NA ...
$ 9 : logi NA NA NA NA NA NA ...
$ 10 : int NA NA NA NA 345 168 NA NA NA NA ...
$ 11 : int NA NA 297 134 NA NA NA NA NA NA ...
$ 12 : logi NA NA NA NA NA NA ...
$ 13 : int NA NA NA NA NA NA NA NA NA NA ...
$ 14 : int NA NA NA NA NA NA NA NA NA NA ...
$ 15 : int NA NA NA NA NA NA NA NA NA NA ...
$ 16 : int NA NA NA NA 311 176 NA NA NA NA ...
$ 17 : int NA NA NA NA NA NA NA NA NA NA ...
$ 18 : logi NA NA NA NA NA NA ...
$ 19 : logi NA NA NA NA NA NA ...
$ 20 : logi NA NA NA NA NA NA ...
$ 21 : logi NA NA NA NA NA NA ...
$ 22 : logi NA NA NA NA NA NA ...
$ 23 : int NA NA 299 107 NA NA NA NA NA NA ...
$ 24 : logi NA NA NA NA NA NA ...
$ 25 : int NA NA NA NA NA NA NA NA NA NA ...
$ 26 : int NA NA NA NA NA NA NA NA NA NA ...
$ 27 : int NA NA NA NA NA NA 363 167 332 182 ...
$ 28 : int NA NA NA NA NA NA NA NA NA NA ...
$ 29 : int NA NA NA NA NA NA NA NA NA NA ...
$ 30 : int 278 145 NA NA NA NA NA NA NA NA ...
$ 31 : int NA NA NA NA NA NA NA NA NA NA ...
> tidydata3 <- rawdata1 %>% melt(id = c("year", "month", "element"),
+ variable.name = "day",
+ value.name = "temp")
> head(tidydata3)
year month element day temp
1 2010 1 tmax 1 NA
2 2010 1 tmin 1 NA
3 2010 2 tmax 1 NA
4 2010 2 tmin 1 NA
5 2010 3 tmax 1 NA
6 2010 3 tmin 1 NA
> tidydata4 <- rawdata1 %>% melt(id = c("year", "month", "element"),
+ variable.name = "day",
+ value.name = "temp",
+ na.rm = TRUE)
> head(tidydata4)
year month element day temp
21 2010 12 tmax 1 299
22 2010 12 tmin 1 138
25 2010 2 tmax 2 273
26 2010 2 tmin 2 144
41 2010 11 tmax 2 313
42 2010 11 tmin 2 163
> tidydata5 <- rawdata1 %>% gather(4:34,
+ key = "day",
+ value = "temp")
> head(tidydata5)
year month element day temp
1 2010 1 tmax 1 NA
2 2010 1 tmin 1 NA
3 2010 2 tmax 1 NA
4 2010 2 tmin 1 NA
5 2010 3 tmax 1 NA
6 2010 3 tmin 1 NA
> tidydata6 <- rawdata1 %>% gather(4:34,
+ key = "day",
+ value = "temp",
+ na.rm = TRUE)
> head(tidydata6)
year month element day temp
21 2010 12 tmax 1 299
22 2010 12 tmin 1 138
25 2010 2 tmax 2 273
26 2010 2 tmin 2 144
41 2010 11 tmax 2 313
42 2010 11 tmin 2 163
>
dcast and spread
> # transform the data to a format that dcast can use
> tidydata7 <- tidydata6[,c("year", "month", "day", "element", "temp")]
> head(tidydata7)
year month day element temp
21 2010 12 1 tmax 299
22 2010 12 1 tmin 138
25 2010 2 2 tmax 273
26 2010 2 2 tmin 144
41 2010 11 2 tmax 313
42 2010 11 2 tmin 163
> # use element values as column names, pick the values from "temp"
> tidydata8 <- dcast(year + month + day ~ element, data = tidydata7, value.var = "temp")
> head(tidydata8)
year month day tmax tmin
1 2010 1 30 278 145
2 2010 2 11 297 134
3 2010 2 2 273 144
4 2010 2 23 299 107
5 2010 2 3 241 144
6 2010 3 10 345 168
> # do the same using spread - spread element as columns and use values from temp
> tidydata9 <- spread(tidydata6, element, temp)
> head(tidydata9)
year month day tmax tmin
1 2010 1 30 278 145
2 2010 2 11 297 134
3 2010 2 2 273 144
4 2010 2 23 299 107
5 2010 2 3 241 144
6 2010 3 10 345 168
> # adding a new column which shows difference in temperature
> tidydata8$tdiff <- tidydata8$tmax - tidydata8$tmin
> head(tidydata8)
year month day tmax tmin tdiff
1 2010 1 30 278 145 133
2 2010 2 11 297 134 163
3 2010 2 2 273 144 129
4 2010 2 23 299 107 192
5 2010 2 3 241 144 97
6 2010 3 10 345 168 177
>
>
Analyze the titanic shipwreck data to answer the following,
- For each group of Class+Age+Gender what is the survival rate?
- To answer this question, we need to transform the given data
> rawdata2 <- read.csv("shipwreck.csv", check.names = F, encoding = "UTF-8")
> rawdata2
class age fate male female
1 1st adult perished 118 4
2 1st adult survived 57 140
3 1st child perished 0 0
4 1st child survived 5 1
5 2nd adult perished 154 13
6 2nd adult survived 14 80
7 2nd child perished 0 0
8 2nd child survived 11 13
9 3rd adult perished 387 89
10 3rd adult survived 75 76
11 3rd child perished 35 17
12 3rd child survived 13 14
13 Crew adult perished 670 3
14 Crew adult survived 192 20
15 Crew child perished 0 0
16 Crew child survived 0 0
> # Q - For each group of Class+Age+Gender what is the survival rate?
> tidydata10 <- rawdata2 %>% gather(4:5,
+ key = "gender",
+ value = "count")
> tidydata10
class age fate gender count
1 1st adult perished male 118
2 1st adult survived male 57
3 1st child perished male 0
4 1st child survived male 5
5 2nd adult perished male 154
6 2nd adult survived male 14
7 2nd child perished male 0
8 2nd child survived male 11
9 3rd adult perished male 387
10 3rd adult survived male 75
11 3rd child perished male 35
12 3rd child survived male 13
13 Crew adult perished male 670
14 Crew adult survived male 192
15 Crew child perished male 0
16 Crew child survived male 0
17 1st adult perished female 4
18 1st adult survived female 140
19 1st child perished female 0
20 1st child survived female 1
21 2nd adult perished female 13
22 2nd adult survived female 80
23 2nd child perished female 0
24 2nd child survived female 13
25 3rd adult perished female 89
26 3rd adult survived female 76
27 3rd child perished female 17
28 3rd child survived female 14
29 Crew adult perished female 3
30 Crew adult survived female 20
31 Crew child perished female 0
32 Crew child survived female 0
> tidydata10 <- tidydata10 %>% spread(fate, count)
> tidydata10
class age gender perished survived
1 1st adult female 4 140
2 1st adult male 118 57
3 1st child female 0 1
4 1st child male 0 5
5 2nd adult female 13 80
6 2nd adult male 154 14
7 2nd child female 0 13
8 2nd child male 0 11
9 3rd adult female 89 76
10 3rd adult male 387 75
11 3rd child female 17 14
12 3rd child male 35 13
13 Crew adult female 3 20
14 Crew adult male 670 192
15 Crew child female 0 0
16 Crew child male 0 0
>
deplyr
- filter
- arrange
- mutate
- summarize
- select
- group_by
> # filter data for Jan
> head(flights)
# A tibble: 6 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance hour minute
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 2013 1 1 517 515 2.00 830 819 11.0 UA 1545 N14228 EWR IAH 227 1400 5.00 15.0
2 2013 1 1 533 529 4.00 850 830 20.0 UA 1714 N24211 LGA IAH 227 1416 5.00 29.0
3 2013 1 1 542 540 2.00 923 850 33.0 AA 1141 N619AA JFK MIA 160 1089 5.00 40.0
4 2013 1 1 544 545 -1.00 1004 1022 -18.0 B6 725 N804JB JFK BQN 183 1576 5.00 45.0
5 2013 1 1 554 600 -6.00 812 837 -25.0 DL 461 N668DN LGA ATL 116 762 6.00 0
6 2013 1 1 554 558 -4.00 740 728 12.0 UA 1696 N39463 EWR ORD 150 719 5.00 58.0
# ... with 1 more variable: time_hour <dttm>
> flights %>% filter(month==1)
# A tibble: 27,004 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance hour minute
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 2013 1 1 517 515 2.00 830 819 11.0 UA 1545 N14228 EWR IAH 227 1400 5.00 15.0
2 2013 1 1 533 529 4.00 850 830 20.0 UA 1714 N24211 LGA IAH 227 1416 5.00 29.0
3 2013 1 1 542 540 2.00 923 850 33.0 AA 1141 N619AA JFK MIA 160 1089 5.00 40.0
4 2013 1 1 544 545 -1.00 1004 1022 -18.0 B6 725 N804JB JFK BQN 183 1576 5.00 45.0
5 2013 1 1 554 600 -6.00 812 837 -25.0 DL 461 N668DN LGA ATL 116 762 6.00 0
6 2013 1 1 554 558 -4.00 740 728 12.0 UA 1696 N39463 EWR ORD 150 719 5.00 58.0
7 2013 1 1 555 600 -5.00 913 854 19.0 B6 507 N516JB EWR FLL 158 1065 6.00 0
8 2013 1 1 557 600 -3.00 709 723 -14.0 EV 5708 N829AS LGA IAD 53.0 229 6.00 0
9 2013 1 1 557 600 -3.00 838 846 - 8.00 B6 79 N593JB JFK MCO 140 944 6.00 0
10 2013 1 1 558 600 -2.00 753 745 8.00 AA 301 N3ALAA LGA ORD 138 733 6.00 0
# ... with 26,994 more rows, and 1 more variable: time_hour <dttm>
> # filter data for Nov and Dec
> flights %>% filter(month==11 | month == 12)
# A tibble: 55,403 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance hour minute
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 2013 11 1 5 2359 6.00 352 345 7.00 B6 745 N568JB JFK PSE 205 1617 23.0 59.0
2 2013 11 1 35 2250 105 123 2356 87.0 B6 1816 N353JB JFK SYR 36.0 209 22.0 50.0
3 2013 11 1 455 500 - 5.00 641 651 -10.0 US 1895 N192UW EWR CLT 88.0 529 5.00 0
4 2013 11 1 539 545 - 6.00 856 827 29.0 UA 1714 N38727 LGA IAH 229 1416 5.00 45.0
5 2013 11 1 542 545 - 3.00 831 855 -24.0 AA 2243 N5CLAA JFK MIA 147 1089 5.00 45.0
6 2013 11 1 549 600 - 11.0 912 923 -11.0 UA 303 N595UA JFK SFO 359 2586 6.00 0
7 2013 11 1 550 600 - 10.0 705 659 6.00 US 2167 N748UW LGA DCA 57.0 214 6.00 0
8 2013 11 1 554 600 - 6.00 659 701 - 2.00 US 2134 N742PS LGA BOS 40.0 184 6.00 0
9 2013 11 1 554 600 - 6.00 826 827 - 1.00 DL 563 N912DE LGA ATL 126 762 6.00 0
10 2013 11 1 554 600 - 6.00 749 751 - 2.00 DL 731 N315NB LGA DTW 93.0 502 6.00 0
# ... with 55,393 more rows, and 1 more variable: time_hour <dttm>
> flights %>% filter(month %in% c(11,12))
# A tibble: 55,403 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance hour minute
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 2013 11 1 5 2359 6.00 352 345 7.00 B6 745 N568JB JFK PSE 205 1617 23.0 59.0
2 2013 11 1 35 2250 105 123 2356 87.0 B6 1816 N353JB JFK SYR 36.0 209 22.0 50.0
3 2013 11 1 455 500 - 5.00 641 651 -10.0 US 1895 N192UW EWR CLT 88.0 529 5.00 0
4 2013 11 1 539 545 - 6.00 856 827 29.0 UA 1714 N38727 LGA IAH 229 1416 5.00 45.0
5 2013 11 1 542 545 - 3.00 831 855 -24.0 AA 2243 N5CLAA JFK MIA 147 1089 5.00 45.0
6 2013 11 1 549 600 - 11.0 912 923 -11.0 UA 303 N595UA JFK SFO 359 2586 6.00 0
7 2013 11 1 550 600 - 10.0 705 659 6.00 US 2167 N748UW LGA DCA 57.0 214 6.00 0
8 2013 11 1 554 600 - 6.00 659 701 - 2.00 US 2134 N742PS LGA BOS 40.0 184 6.00 0
9 2013 11 1 554 600 - 6.00 826 827 - 1.00 DL 563 N912DE LGA ATL 126 762 6.00 0
10 2013 11 1 554 600 - 6.00 749 751 - 2.00 DL 731 N315NB LGA DTW 93.0 502 6.00 0
# ... with 55,393 more rows, and 1 more variable: time_hour <dttm>
> # filter data with departure and arrival delay < 2 hours
> str(flights)
Classes 'tbl_df', 'tbl' and 'data.frame': 336776 obs. of 19 variables:
$ year : int 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
$ month : int 1 1 1 1 1 1 1 1 1 1 ...
$ day : int 1 1 1 1 1 1 1 1 1 1 ...
$ dep_time : int 517 533 542 544 554 554 555 557 557 558 ...
$ sched_dep_time: int 515 529 540 545 600 558 600 600 600 600 ...
$ dep_delay : num 2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
$ arr_time : int 830 850 923 1004 812 740 913 709 838 753 ...
$ sched_arr_time: int 819 830 850 1022 837 728 854 723 846 745 ...
$ arr_delay : num 11 20 33 -18 -25 12 19 -14 -8 8 ...
$ carrier : chr "UA" "UA" "AA" "B6" ...
$ flight : int 1545 1714 1141 725 461 1696 507 5708 79 301 ...
$ tailnum : chr "N14228" "N24211" "N619AA" "N804JB" ...
$ origin : chr "EWR" "LGA" "JFK" "JFK" ...
$ dest : chr "IAH" "IAH" "MIA" "BQN" ...
$ air_time : num 227 227 160 183 116 150 158 53 140 138 ...
$ distance : num 1400 1416 1089 1576 762 ...
$ hour : num 5 5 5 5 6 5 6 6 6 6 ...
$ minute : num 15 29 40 45 0 58 0 0 0 0 ...
$ time_hour : POSIXct, format: "2013-01-01 05:00:00" "2013-01-01 05:00:00" "2013-01-01 05:00:00" "2013-01-01 05:00:00" ...
> flights %>% filter(dep_delay < 120 & arr_delay < 120) %>% select(arr_delay, dep_delay, everything())
# A tibble: 315,868 x 19
arr_delay dep_delay year month day dep_time sched_dep_time arr_time sched_arr_time carrier flight tailnum origin dest air_time distance hour minute
<dbl> <dbl> <int> <int> <int> <int> <int> <int> <int> <chr> <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 11.0 2.00 2013 1 1 517 515 830 819 UA 1545 N14228 EWR IAH 227 1400 5.00 15.0
2 20.0 4.00 2013 1 1 533 529 850 830 UA 1714 N24211 LGA IAH 227 1416 5.00 29.0
3 33.0 2.00 2013 1 1 542 540 923 850 AA 1141 N619AA JFK MIA 160 1089 5.00 40.0
4 -18.0 -1.00 2013 1 1 544 545 1004 1022 B6 725 N804JB JFK BQN 183 1576 5.00 45.0
5 -25.0 -6.00 2013 1 1 554 600 812 837 DL 461 N668DN LGA ATL 116 762 6.00 0
6 12.0 -4.00 2013 1 1 554 558 740 728 UA 1696 N39463 EWR ORD 150 719 5.00 58.0
7 19.0 -5.00 2013 1 1 555 600 913 854 B6 507 N516JB EWR FLL 158 1065 6.00 0
8 -14.0 -3.00 2013 1 1 557 600 709 723 EV 5708 N829AS LGA IAD 53.0 229 6.00 0
9 - 8.00 -3.00 2013 1 1 557 600 838 846 B6 79 N593JB JFK MCO 140 944 6.00 0
10 8.00 -2.00 2013 1 1 558 600 753 745 AA 301 N3ALAA LGA ORD 138 733 6.00 0
# ... with 315,858 more rows, and 1 more variable: time_hour <dttm>
> # show the makeup time
> flights %>% mutate(makeuptime = dep_delay - arr_delay) %>% select(makeuptime, everything())
# A tibble: 336,776 x 20
makeuptime year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance hour
<dbl> <int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr> <chr> <chr> <dbl> <dbl> <dbl>
1 - 9.00 2013 1 1 517 515 2.00 830 819 11.0 UA 1545 N14228 EWR IAH 227 1400 5.00
2 -16.0 2013 1 1 533 529 4.00 850 830 20.0 UA 1714 N24211 LGA IAH 227 1416 5.00
3 -31.0 2013 1 1 542 540 2.00 923 850 33.0 AA 1141 N619AA JFK MIA 160 1089 5.00
4 17.0 2013 1 1 544 545 -1.00 1004 1022 -18.0 B6 725 N804JB JFK BQN 183 1576 5.00
5 19.0 2013 1 1 554 600 -6.00 812 837 -25.0 DL 461 N668DN LGA ATL 116 762 6.00
6 -16.0 2013 1 1 554 558 -4.00 740 728 12.0 UA 1696 N39463 EWR ORD 150 719 5.00
7 -24.0 2013 1 1 555 600 -5.00 913 854 19.0 B6 507 N516JB EWR FLL 158 1065 6.00
8 11.0 2013 1 1 557 600 -3.00 709 723 -14.0 EV 5708 N829AS LGA IAD 53.0 229 6.00
9 5.00 2013 1 1 557 600 -3.00 838 846 - 8.00 B6 79 N593JB JFK MCO 140 944 6.00
10 -10.0 2013 1 1 558 600 -2.00 753 745 8.00 AA 301 N3ALAA LGA ORD 138 733 6.00
# ... with 336,766 more rows, and 2 more variables: minute <dbl>, time_hour <dttm>
>
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> # for every species list the average sepal length
> iris %>% group_by(Species) %>% summarise(meanSepl = mean(Sepal.Length))
# A tibble: 3 x 2
Species meanSepl
<fct> <dbl>
1 setosa 5.01
2 versicolor 5.94
3 virginica 6.59
> head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
> # list mean of mpg for every combination of gear and cylinder
> mtcars %>% group_by(gear, cyl) %>% summarise(mean1 = mean(mpg))
# A tibble: 8 x 3
# Groups: gear [?]
gear cyl mean1
<dbl> <dbl> <dbl>
1 3.00 4.00 21.5
2 3.00 6.00 19.8
3 3.00 8.00 15.0
4 4.00 4.00 26.9
5 4.00 6.00 19.8
6 5.00 4.00 28.2
7 5.00 6.00 19.7
8 5.00 8.00 15.4
> # add a new column that lists mpg + displacement
> mtcars %>% group_by(gear, cyl) %>% mutate(newcol = mpg + disp)
# A tibble: 32 x 12
# Groups: gear, cyl [8]
mpg cyl disp hp drat wt qsec vs am gear carb newcol
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 21.0 6.00 160 110 3.90 2.62 16.5 0 1.00 4.00 4.00 181
2 21.0 6.00 160 110 3.90 2.88 17.0 0 1.00 4.00 4.00 181
3 22.8 4.00 108 93.0 3.85 2.32 18.6 1.00 1.00 4.00 1.00 131
4 21.4 6.00 258 110 3.08 3.22 19.4 1.00 0 3.00 1.00 279
5 18.7 8.00 360 175 3.15 3.44 17.0 0 0 3.00 2.00 379
6 18.1 6.00 225 105 2.76 3.46 20.2 1.00 0 3.00 1.00 243
7 14.3 8.00 360 245 3.21 3.57 15.8 0 0 3.00 4.00 374
8 24.4 4.00 147 62.0 3.69 3.19 20.0 1.00 0 4.00 2.00 171
9 22.8 4.00 141 95.0 3.92 3.15 22.9 1.00 0 4.00 2.00 164
10 19.2 6.00 168 123 3.92 3.44 18.3 1.00 0 4.00 4.00 187
# ... with 22 more rows
>