欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

R for Data Science总结之——tibble

程序员文章站 2022-03-01 15:43:32
...

R中传统的data.frame是很老的数据结构,而在新的tidyverse框架中提出了新的tibble来替代一些老的行为模式:

library(tidyverse)

将老式数据框转换成tibble:

as_tibble(iris)
#> # A tibble: 150 x 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 
#> # ... with 144 more rows

用向量创建tibble:

tibble(
  x = 1:5, 
  y = 1, 
  z = x ^ 2 + y
)
#> # A tibble: 5 x 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

和data.frame()不同的是,tibble()更加懒惰,不会将string类型的数据转换成factor:

tb <- tibble(
  `:)` = "smile", 
  ` ` = "space",
  `2000` = "number"
)
tb
#> # A tibble: 1 x 3
#>   `:)`  ` `   `2000`
#>   <chr> <chr> <chr> 
#> 1 smile space number

另外也可以用tribble()创建tibble, t表示的是transposed转置:

tribble(
  ~x, ~y, ~z,
  #--|--|----
  "a", 2, 3.6,
  "b", 1, 8.5
)
#> # A tibble: 2 x 3
#>   x         y     z
#>   <chr> <dbl> <dbl>
#> 1 a         2   3.6
#> 2 b         1   8.5

tibble vs data.frame

tibble只显示数据集的前十行:

tibble(
  a = lubridate::now() + runif(1e3) * 86400,
  b = lubridate::today() + runif(1e3) * 30,
  c = 1:1e3,
  d = runif(1e3),
  e = sample(letters, 1e3, replace = TRUE)
)
#> # A tibble: 1,000 x 5
#>   a                   b              c     d e    
#>   <dttm>              <date>     <int> <dbl> <chr>
#> 1 2018-08-24 18:13:19 2018-08-31     1 0.368 h    
#> 2 2018-08-25 12:18:28 2018-09-05     2 0.612 n    
#> 3 2018-08-25 06:42:07 2018-09-15     3 0.415 l    
#> 4 2018-08-24 20:03:25 2018-09-14     4 0.212 x    
#> 5 2018-08-24 16:27:41 2018-09-11     5 0.733 a    
#> 6 2018-08-25 03:28:38 2018-09-07     6 0.460 v    
#> # ... with 994 more rows

如果想调整这个特性可以设置:

nycflights13::flights %>% 
  print(n = 10, width = Inf)
options(tibble.print_max = n, tibble.print_min = m)
options(tibble.print_min = Inf)
options(tibble.width = Inf)
nycflights13::flights %>% 
  View()

子集

tibble挑选子集有$和[[两种方式:

df <- tibble(
  x = runif(5),
  y = rnorm(5)
)

# Extract by name
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

# Extract by position
df[[1]]
#> [1] 0.434 0.395 0.548 0.762 0.254

若想在pipes中使用可以用.占位符:

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

若要调用一些老的使用data.frame的包,需要将tibble转换成data.frame:

class(as.data.frame(tb))
#> [1] "data.frame"

本文代码已上传GITHUB点此进入