既生 data.frame,何生 tibble?
tibble 是一种简单数据框,它对传统数据框的功能进行了一些修改,其所提供的简单数据框更易于在 tidyverse 中使用。
多数情况下,我们会交替使用 tibble 和数据框这两个术语。
tibble 包是 tidyverse 的核心包之一,因此安装 tidyverse 就可以了。
install.packages('tidyverse')
因为 tibble 是 tidyverse 的标准功能之一,所以 tidyverse 中几乎所有函数都可以创建 tibble。
tidyverse 中许多函数都可以创建 tibble,因为 tibble 是 tidyverse 的标准功能之一。
可以通过 tibble() 函数使用一个向量来创建新 tibble。tibble() 会自动重复长度为 1 的输 入,并可以使用刚刚创建的新变量,如下所示:
library(tidyverse)
tibble(
x = 1:5,
y = 1,
z = x ^ 2 + y
)
## # A tibble: 5 × 3
## x y z
## <int> <dbl> <dbl>
## 1 1 1 2
## 2 2 1 5
## 3 3 1 10
## 4 4 1 17
## 5 5 1 26
tibble() 函数比data.frame() 函数功能要少得多:它不能改变输入的类型(例如,不能将字符串转换为因子)、变量的名称,也不能创建行名称。
可以在 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:
tb <- as_tibble(iris)
class(tb)
## [1] "tbl_df" "tbl" "data.frame"
tibble 转换为数据框:
df <- as.data.frame(tb)
class(df)
## [1] "data.frame"
tibble 和传统 data.frame 的使用方法主要有两处不同:打印和取子集。
tibble 的打印方法进行了优化,只显示前 10 行结果,并且列也是适合屏幕的,这种方式非 常适合大数据集。除了打印列名,tibble 还会打印出列的类型,这项非常棒的功能借鉴于 str() 函数。
tb
## # A tibble: 150 × 5
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## <dbl> <dbl> <dbl> <dbl> <fct>
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3 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 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## # … with 140 more rows
有两个工具可以提取数据框的单个变量:
df <- tibble(
x = runif(5),
y = rnorm(5) )
# 按名称提取
df$x
## [1] 0.8070801 0.1610041 0.3952444 0.1384965 0.5667709
df[['x']]
## [1] 0.8070801 0.1610041 0.3952444 0.1384965 0.5667709
# 按位置提取
df[[1]]
## [1] 0.8070801 0.1610041 0.3952444 0.1384965 0.5667709
要想在管道中使用这些提取操作,需要使用特殊的占位符 .
:
df %>% .$x
## [1] 0.8070801 0.1610041 0.3952444 0.1384965 0.5667709
df %>% .[['x']]
## [1] 0.8070801 0.1610041 0.3952444 0.1384965 0.5667709
与 data.frame 相比,tibble 更严格:它不能进行部分匹配,如果想要访问的列不存在,它会生成一条警告信息。
tibble 相对于数据框来说,更简单,但更方便使用,两者的主要区别是: