library("tidyverse")
Loading tidyverse: ggplot2
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages ------------------------------------------------------------------------------------
filter(): dplyr, stats
lag():    dplyr, stats

How can you tell if an object is a tibble? (Hint: try printing mtcars, which is a regular data frame).

On print, a tibble only show the first 10 rows and the columnt types as well.

tb_iris <- as_tibble(iris)
print(tb_iris)

Compare and contrast the following operations on a data.frame and equivalent tibble. What is different? Why might the default data frame behaviours cause you frustration?

df <- data.frame(abc = 1, xyz = "a")
# Notice: No warning on missing column!
df$x
[1] a
Levels: a
# Returning a factor
class(df[, "xyz"])
[1] "factor"
# Returning a data frame
class(df[, c("abc", "xyz")])
[1] "data.frame"
tb_df <- as_tibble(df)
# Notice: Shows warning on missing column!
tb_df$x
Unknown or uninitialised column: 'x'.
NULL
# Returning a tibble
class(tb_df[, "xyz"])
[1] "tbl_df"     "tbl"        "data.frame"
# Returning a tibble
class(tb_df[, c("abc", "xyz")])
[1] "tbl_df"     "tbl"        "data.frame"

If you have the name of a variable stored in an object, e.g. var <- “mpg”, how can you extract the reference variable from a tibble?

tb_cars <- as_tibble(mtcars)
var <- "mpg"
tb_cars[var]
mtcars[var]

Practice referring to non-syntactic names in the following data frame by:

annoying <- tibble(
  `1` = 1:10,
  `2` = `1` * 2 + rnorm(length(`1`))
)

Extracting the variable called 1.

annoying$`1`
 [1]  1  2  3  4  5  6  7  8  9 10

Plotting a scatterplot of 1 vs 2.

ggplot(data = annoying) +
  geom_point(aes(x = `1`, y = `2`))

Creating a new column called 3 which is 2 divided by 1.

mutate(annoying, `3` = `2` / `1`)

Renaming the columns to one, two and three.

transmute(annoying, one = `1`, two = `2`, three = `3`)

What does tibble::enframe() do? When might you use it?

# Converting atomic vectors to data frames, and vice versa
# For backwards compatibility with data frames
help(enframe)
LS0tDQp0aXRsZTogIlIgZm9yIERhdGEgU2NpZW5jZTogVGliYmxlcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KbGlicmFyeSgidGlkeXZlcnNlIikNCmBgYA0KDQojIyMgSG93IGNhbiB5b3UgdGVsbCBpZiBhbiBvYmplY3QgaXMgYSB0aWJibGU/IChIaW50OiB0cnkgcHJpbnRpbmcgbXRjYXJzLCB3aGljaCBpcyBhIHJlZ3VsYXIgZGF0YSBmcmFtZSkuDQoNCk9uIHByaW50LCBhIHRpYmJsZSBvbmx5IHNob3cgdGhlIGZpcnN0IDEwIHJvd3MgYW5kIHRoZSBjb2x1bW50IHR5cGVzIGFzIHdlbGwuDQoNCmBgYHtyfQ0KdGJfaXJpcyA8LSBhc190aWJibGUoaXJpcykNCnByaW50KHRiX2lyaXMpDQpgYGANCg0KDQojIyMgQ29tcGFyZSBhbmQgY29udHJhc3QgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIG9uIGEgZGF0YS5mcmFtZSBhbmQgZXF1aXZhbGVudCB0aWJibGUuIFdoYXQgaXMgZGlmZmVyZW50PyBXaHkgbWlnaHQgdGhlIGRlZmF1bHQgZGF0YSBmcmFtZSBiZWhhdmlvdXJzIGNhdXNlIHlvdSBmcnVzdHJhdGlvbj8NCg0KYGBge3J9DQpkZiA8LSBkYXRhLmZyYW1lKGFiYyA9IDEsIHh5eiA9ICJhIikNCiMgTm90aWNlOiBObyB3YXJuaW5nIG9uIG1pc3NpbmcgY29sdW1uIQ0KZGYkeA0KIyBSZXR1cm5pbmcgYSBmYWN0b3INCmNsYXNzKGRmWywgInh5eiJdKQ0KIyBSZXR1cm5pbmcgYSBkYXRhIGZyYW1lDQpjbGFzcyhkZlssIGMoImFiYyIsICJ4eXoiKV0pDQoNCnRiX2RmIDwtIGFzX3RpYmJsZShkZikNCiMgTm90aWNlOiBTaG93cyB3YXJuaW5nIG9uIG1pc3NpbmcgY29sdW1uIQ0KdGJfZGYkeA0KIyBSZXR1cm5pbmcgYSB0aWJibGUNCmNsYXNzKHRiX2RmWywgInh5eiJdKQ0KIyBSZXR1cm5pbmcgYSB0aWJibGUNCmNsYXNzKHRiX2RmWywgYygiYWJjIiwgInh5eiIpXSkNCmBgYA0KDQoNCiMjIyBJZiB5b3UgaGF2ZSB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlIHN0b3JlZCBpbiBhbiBvYmplY3QsIGUuZy4gdmFyIDwtICJtcGciLCBob3cgY2FuIHlvdSBleHRyYWN0IHRoZSByZWZlcmVuY2UgdmFyaWFibGUgZnJvbSBhIHRpYmJsZT8NCg0KYGBge3J9DQp0Yl9jYXJzIDwtIGFzX3RpYmJsZShtdGNhcnMpDQp2YXIgPC0gIm1wZyINCnRiX2NhcnNbdmFyXQ0KbXRjYXJzW3Zhcl0NCmBgYA0KDQoNCiMjIyBQcmFjdGljZSByZWZlcnJpbmcgdG8gbm9uLXN5bnRhY3RpYyBuYW1lcyBpbiB0aGUgZm9sbG93aW5nIGRhdGEgZnJhbWUgYnk6DQoNCmBgYHtyfQ0KYW5ub3lpbmcgPC0gdGliYmxlKA0KICBgMWAgPSAxOjEwLA0KICBgMmAgPSBgMWAgKiAyICsgcm5vcm0obGVuZ3RoKGAxYCkpDQopDQpgYGANCg0KIyMjIyBFeHRyYWN0aW5nIHRoZSB2YXJpYWJsZSBjYWxsZWQgMS4NCg0KYGBge3J9DQphbm5veWluZyRgMWANCmBgYA0KDQojIyMjIFBsb3R0aW5nIGEgc2NhdHRlcnBsb3Qgb2YgMSB2cyAyLg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gYW5ub3lpbmcpICsNCiAgZ2VvbV9wb2ludChhZXMoeCA9IGAxYCwgeSA9IGAyYCkpDQpgYGANCg0KDQojIyMjIENyZWF0aW5nIGEgbmV3IGNvbHVtbiBjYWxsZWQgMyB3aGljaCBpcyAyIGRpdmlkZWQgYnkgMS4NCg0KYGBge3J9DQptdXRhdGUoYW5ub3lpbmcsIGAzYCA9IGAyYCAvIGAxYCkNCmBgYA0KDQojIyMjIFJlbmFtaW5nIHRoZSBjb2x1bW5zIHRvIG9uZSwgdHdvIGFuZCB0aHJlZS4NCg0KYGBge3J9DQp0cmFuc211dGUoYW5ub3lpbmcsIG9uZSA9IGAxYCwgdHdvID0gYDJgLCB0aHJlZSA9IGAzYCkNCmBgYA0KDQojIyMgV2hhdCBkb2VzIHRpYmJsZTo6ZW5mcmFtZSgpIGRvPyBXaGVuIG1pZ2h0IHlvdSB1c2UgaXQ/DQoNCmBgYHtyfQ0KIyBDb252ZXJ0aW5nIGF0b21pYyB2ZWN0b3JzIHRvIGRhdGEgZnJhbWVzLCBhbmQgdmljZSB2ZXJzYQ0KIyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBkYXRhIGZyYW1lcw0KaGVscChlbmZyYW1lKQ0KYGBgDQoNCiMjIyBXaGF0IG9wdGlvbiBjb250cm9scyBob3cgbWFueSBhZGRpdGlvbmFsIGNvbHVtbiBuYW1lcyBhcmUgcHJpbnRlZCBhdCB0aGUgZm9vdGVyIG9mIGEgdGliYmxlPw0KDQpgYGB7cn0NCiMgdGliYmxlLm1heF9leHRyYV9jb2xzDQojIE51bWJlciBvZiBleHRyYSBjb2x1bW5zIHByaW50ZWQgaW4gcmVkdWNlZCBmb3JtLiBEZWZhdWx0OiAxMDAuDQpwYWNrYWdlP3RpYmJsZQ0KYGBgDQoNCg==