前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R数据科学整洁之道:使用 tibble 实现简单数据框

R数据科学整洁之道:使用 tibble 实现简单数据框

作者头像
简说基因
发布2022-11-11 16:14:50
1.5K0
发布2022-11-11 16:14:50
举报
文章被收录于专栏:简说基因简说基因

既生 data.frame,何生 tibble?

tibble 是一种简单数据框,它对传统数据框的功能进行了一些修改,其所提供的简单数据框更易于在 tidyverse 中使用。

多数情况下,我们会交替使用 tibble 和数据框这两个术语。

安装

tibble 包是 tidyverse 的核心包之一,因此安装 tidyverse 就可以了。

代码语言:javascript
复制
install.packages('tidyverse')

创建 tibble

因为 tibble 是 tidyverse 的标准功能之一,所以 tidyverse 中几乎所有函数都可以创建 tibble。

tidyverse 中许多函数都可以创建 tibble,因为 tibble 是 tidyverse 的标准功能之一。

可以通过 tibble() 函数使用一个向量来创建新 tibble。tibble() 会自动重复长度为 1 的输 入,并可以使用刚刚创建的新变量,如下所示:

代码语言:javascript
复制
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 中无效的变量名称(即不符合语法的名称)作为列名称。例如, 列名称可以不以字母开头,也可以包含特殊字符(如空格)。要想引用这样的变量,需要 使用反引号 ` 将它们括起来:

代码语言:javascript
复制
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() 是定制化的,可以对数据按行进行编码:列标题由公式(以 ~ 开头) 定义,数据条目以逗号分隔,这样就可以用易读的方式对少量数据进行布局:

代码语言:javascript
复制
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:

代码语言:javascript
复制
tb <- as_tibble(iris)
class(tb)
## [1] "tbl_df"     "tbl"        "data.frame"

tibble 转换为数据框:

代码语言:javascript
复制
df <- as.data.frame(tb)
class(df)
## [1] "data.frame"

与 data.frame 比较

tibble 和传统 data.frame 的使用方法主要有两处不同:打印和取子集。

打印

tibble 的打印方法进行了优化,只显示前 10 行结果,并且列也是适合屏幕的,这种方式非 常适合大数据集。除了打印列名,tibble 还会打印出列的类型,这项非常棒的功能借鉴于 str() 函数。

代码语言:javascript
复制
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

取子集

有两个工具可以提取数据框的单个变量:

  • $,只能按名称提取变量,但可以减少一些输入。
  • [[,可以按名称或位置提取变量。
代码语言:javascript
复制
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

要想在管道中使用这些提取操作,需要使用特殊的占位符 .

代码语言:javascript
复制
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 相对于数据框来说,更简单,但更方便使用,两者的主要区别是:

  • tibble 不能创建行名。
  • tibble 不能改变输入的类型(例如,不能将字符串转换为因子)、变量的名称。
  • tibble 不能进行部分匹配,如果想要访问的列不存在,它会生成一条警告信息。
  • tibble 打印时更美观。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 简说基因 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 创建 tibble
  • tibble 与 data.frame 互换
  • 与 data.frame 比较
    • 打印
      • 取子集
      • 最后总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档