目录
精华都在实战代码中
️简介
tibble 是一种简单数据框,它对传统数据框的功能进 行了一些修改,以便更易于使用。R 是一门古老的语言,其中有些功能在 10 年或 20 年前是适用的,但现在已经过时。在不破坏现有代码的前提下,很难修改 R 的基础功能,因此多数革新都是以扩展包的方式出现的。本章会介绍 tibble,其所提供的简单数据框更易于在tidyverse 中使用。
library(tidyverse)
创建tibble
由于多数其他 R 包使用的是标准数据框,因此你可能想要将数据框转换为 tibble。可以使 用 as_tibble() 函数来完成转换:
as_tibble(iris)
可以通过 tibble() 函数使用一个向量来创建新 tibble。tibble() 会自动重复长度为 1 的输 入,并可以使用刚刚创建的新变量,如下所示:
tibble(
x = 1:5,
y = 1,
z=x^2+ y
)
Tibble columns must have compatible sizes.
可以在 tibble 中使用在 R 中无效的变量名称(即不符合语法的名称)作为列名称。例如, 列名称可以不以字母开头,也可以包含特殊字符(如空格)。要想引用这样的变量,需要 使用反引号 ` 将它们括起来:
tb <- tibble(
`:)` = "smile",
` ` = "space",
`2000` = "number"
)
tb
#> # A tibble: 1 × 3
#> `:)` ` ` `2000`
#> <chr> <chr> <chr>
#> 1 smile space number
如果要在 ggplot2 和 dplyr 等其他 R 包中使用这些变量,也需要使用反引号。
创建 tibble 的另一种方法是使用 tribble() 函数
tribble 是 transposed tibble(转置 tibble) 的缩写。tribble() 是定制化的,可以对数据按行进行编码:列标题由公式(以 ~ 开头) 定义,数据条目以逗号分隔,这样就可以用易读的方式对少量数据进行布局:
tribble(
~x, ~y, ~z,
#--|--|----
"a", 2, 3.6,
"b", 1, 8.5
)
#> # A tibble: 2 × 3
#> x y z
#> <chr> <dbl> <dbl>
#> 1 a 2 3.6
#> 2 b 1 8.5
通常会加一条注释(以 # 开头的行)来明确指出标题行的位置。
对比tibble与data.frame
打印
tibble的打印只显示前十行结果,而且列适应屏幕,tibble还会打印列的类型。
可以明确使用 print() 函数来打印数据框,并控制打印的行数(n)和显示的宽度 (width)。
width = Inf 可以显示出所有列:
nycflights13::flights %>% print(n = 10, width = Inf)
还可以通过设置以下选项来控制默认的打印方式。
• options(tibble.print_max = n, tibble.print_min = m):如果多于 m 行,则只打印出 n 行。
options(tibble.print_min = Inf) 表示总是打印所有行。
• options(tibble.width = Inf) 表示总是打印所有列,不考虑屏幕的宽度。
取子集
按名称提取
df$x
[[ 可以按名称或位置提取变量;$ 只能按名称提取变量
要想在管道中使用这些提取操作,需要使用特殊的占位符 .:
df %>% .$x
#> [1] 0.434 0.395 0.548 0.762 0.254
等价于
df %>% .[["x"]]
#> [1] 0.434 0.395 0.548 0.762 0.254
与旧代码进行交互
旧函数不支持tibble的主要原因在于[ 的功能。对于R基础包中的数据框,[有时返回一个数据框,有时返回一个向量。对于tibble,[则总是返回另一个tibble。
class(as.data.frame(tb))
#> [1] "data.frame"
有些旧函数不支持 tibble
练习
- 用is_tibble()识别一个对象是否是tibble
-
> df <- data.frame(abc = 1, xyz = "a") > df$x [1] "a" > df[,"xyz"] [1] "a" > df[,c("abc","xyz")] abc xyz 1 1 a > df abc xyz 1 1 a > df <- tibble(abc = 1, xyz = "a") > df$x NULL Warning message: Unknown or uninitialised column: `x`. > df[,"xyz"] # A tibble: 1 × 1 xyz <chr> 1 a > df[,c("abc","xyz")] # A tibble: 1 × 2 abc xyz <dbl> <chr> 1 1 a > df # A tibble: 1 × 2 abc xyz <dbl> <chr> 1 1 a
tibble能打印列的类型,查找更精
-
> df[var] <- "mpg" Error in `vectbl_as_new_col_index()`: ! Must assign to columns with a valid subscript vector. ✖ Subscript `var` has the wrong type `function`. ℹ It must be logical, numeric, or character. Run `rlang::last_error()` to see where the error occurred. > df["var"] <- "mpg" > df # A tibble: 1 × 3 abc xyz var <dbl> <chr> <chr> 1 1 a mpg > df[3] # A tibble: 1 × 1 var <chr> 1 mpg > df["var"] # A tibble: 1 × 1 var <chr> 1 mpg > df[ncol = 3] # A tibble: 1 × 3 abc xyz var <dbl> <chr> <chr> 1 1 a mpg
4.
> df <- tibble(abc = 1, xyz = "a", "1" = 1:5)
> df[4]
Error in `df[4]`:
! Can't subset columns past the end.
ℹ Location 4 doesn't exist.
ℹ There are only 3 columns.
Run `rlang::last_error()` to see where the error occurred.
> df[1]
# A tibble: 5 × 1
abc
<dbl>
1 1
2 1
3 1
4 1
5 1
> df["1"]
# A tibble: 5 × 1
`1`
<int>
1 1
2 2
3 3
4 4
5 5
> df$"1"
[1] 1 2 3 4 5
> df$1
Error: unexpected numeric constant in "df$1"
> df <- tibble(val1 = c(1,4,6,8,9,19), val2 = c(3,5,6,8,4,2))
> plot(df[1], df[2])
Error in stripchart.default(x1, ...) : 画图方法不对
> plot(df$val1, df$val2)
annoying <- tibble(
`1` = 1:10
`2` = `1` *2 + rnorm(length(`1`))
)
#提取名称为1的变量
#只有数值
annoying$`1`
#还是tibble
annoying[1]
#绘制表示变量1和变量2关系的散点图
plot(annoying$`1`, annoying$`2`)
#ggplot2画图默认有灰色背景和分割线
library(ggplot2)
ggplot(annoying, aes(`1`, `2`))+
geom_point()
#创建一个名称为3的新列,其值为列2除以列1
annoying$`3` <- annoying$`2` / annoying$`3`
#将这些列重新命名为one、two和three
names(annoying) <- c("one", "two", "three")
5.
enframe() converts named atomic vectors or lists to one- or two-column data frames. For a list, the result will be a nested tibble with a column of type list. For unnamed vectors, the natural sequence is used as name column.
deframe() converts two-column data frames to a named vector or list, using the first column as name and the second column as value. If the input has only one column, an unnamed vector is returned.
### ** Examples
enframe(3:1)
# A tibble: 3 × 2
name value
<int> <int>
1 1 3
2 2 2
3 3 1
enframe(c(a = 5, b = 7))
# A tibble: 2 × 2
name value
<chr> <dbl>
1 a 5
2 b 7
enframe(list(one = 1, two = 2:3, three = 4:6))
# A tibble: 3 × 2
name value
<chr> <list>
1 one <dbl [1]>
2 two <int [2]>
3 three <int [3]>
deframe(enframe(3:1))
1 2 3
3 2 1
deframe(tibble(a = 1:3))
[1] 1 2 3
deframe(tibble(a = as.list(1:3)))
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
代码来自R关于enframe和deframe的帮助文档
6.width控制在tibble底部打印的额外列名称的数量。