7 Tibbles

7.1 准备工作

类似于data.frametibble

library(tidyverse)

7.2 创建tibble

7.2.1 导图

7.2.2 实践

首先,iris数据集是data.frame而不是tibble

is.data.frame(iris)
#> [1] TRUE
is_tibble(iris)
#> [1] FALSE
  • 利用tidyverse函数得到tibble
iris1 <- iris %>% 
  filter(Sepal.Width>3)
is_tibble(iris1)
#> [1] FALSE

实践失败了…利用tidyverse函数,传入数据框,处理之后仍然是数据框。

  • 利用as_tibble创建tibble
iris_tibble <- as_tibble(iris)
is_tibble(iris_tibble)
#> [1] TRUE
  • 使用向量创建
x <- c(1,2,3)
y <- 1
z <- x+y
a <- tibble(x,y,z)
str(a)
#> tibble [3 x 3] (S3: tbl_df/tbl/data.frame)
#>  $ x: num [1:3] 1 2 3
#>  $ y: num [1:3] 1 1 1
#>  $ z: num [1:3] 2 3 4
  • 使用tribble创建
a <- tribble(
  ~x,~y,~z,
  "a",1,1.1,
  "b",2,0.5 
)
str(a)
#> tibble [2 x 3] (S3: tbl_df/tbl/data.frame)
#>  $ x: chr [1:2] "a" "b"
#>  $ y: num [1:2] 1 2
#>  $ z: num [1:2] 1.1 0.5

这个的语法比较新鲜。

7.3 对比tibbledata.frame

打印printtibble默认只显示前 10 行结果,并且列也是适合屏幕的,还会打印出列的类型。可以通过print的参数或者option修改默认设置。

取子集:tibble不能进行部分匹配,如果想要访问的列不存在,会生成一条警告信息。

7.4 与旧代码进行交互

使用as.data.frame()可以将tible转换为data.frame

7.5 练习

(2)对比 data.frame和等价的tibble上进行的以下操作。有何区别?为什么默认的数据框操作会让人感到沮丧?

df <- data.frame(abc = 1, xyz = "a") 
df$x 
#> [1] a
#> Levels: a
df[, "xyz"] 
#> [1] a
#> Levels: a
df[, c("abc", "xyz")]
#>   abc xyz
#> 1   1   a
df <- as_tibble(df)
df$x 
#> Warning: Unknown or uninitialised column: `x`.
#> NULL
df[, "xyz"] 
#> # A tibble: 1 x 1
#>   xyz  
#>   <fct>
#> 1 a
df[, c("abc", "xyz")]
#> # A tibble: 1 x 2
#>     abc xyz  
#>   <dbl> <fct>
#> 1     1 a

区别:tibble不能进行部分匹配,而data.frame可以。并且,data.frame在取一列的时候返回的是向量而不是data.frame,当列名是一个变量时不好处理(你不知道返回的是向量还是data.frame),而tibble则会一致地返回tibble