【r<-数据整理】tibbles

library('tidyverse')

创建 tibbles

如果你想要将R的data.frame强制转换为tibble,可以使用 as_tibble():

as_tibble(iris)
#> # A tibble: 150 x 5
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#>                                   
#> 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(),它会自动进行循环对齐。

tibble(
  x = 1:5, 
  y = 1, 
  z = x ^ 2 + y
)
#> # A tibble: 5 x 3
#>       x     y     z
#>     
#> 1     1     1     2
#> 2     2     1     5
#> 3     3     1    10
#> 4     4     1    17
#> 5     5     1    26

如果你对data.frame()熟悉,会注意到tibble()做的事情更少——这更加符合我们的需要:它从不改变输入数据的类型(例如它不会将字符转换为因子),它也不会改变变量名,并且它不会创建行名。

tibble的列名可能不是合法的R变量名,称为 non-syntactic。我们在使用时需要用到反引号```:

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

另一种创建tibble的方式是使用tribble()tr是转换的缩写,该函数用于自定义代码中的数据输入,列名用公式定义,条目用逗号分隔。这让列出少量的数据并被容易读入变得可能。

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

我通常添加一个注释符号,让信息头变得更清楚。

10.3 Tibbles vs. data.frame

tibble vs. 经典的data.frame存在两处不同:打印和取子集。

10.3.1 打印

Tibbles默认只打印数据的前10行,而且所有的列都会适应屏幕,处理大数据时这将变得更加轻松。除了列名,每一列的数据类型也会打印。

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    
#>                        
#> 1 2018-06-21 05:08:33 2018-06-28     1 0.368 h    
#> 2 2018-06-21 23:13:43 2018-07-03     2 0.612 n    
#> 3 2018-06-21 17:37:22 2018-07-13     3 0.415 l    
#> 4 2018-06-21 06:58:39 2018-07-12     4 0.212 x    
#> 5 2018-06-21 03:22:56 2018-07-09     5 0.733 a    
#> 6 2018-06-21 14:23:53 2018-07-05     6 0.460 v    
#> # ... with 994 more rows

有时候你可能需要自定义打印行与列,有以下方式

你可以使用print()指定数据框,用n控制行,用width控制列:

nycflights13::flights %>% 
  print(n = 10, width = Inf)

你也可以设置选项以更改默认的打印行为:

  • options(tibble.print_max = n, tibble.print_min = m): 如果大于n行,仅打印m行。使用 options(tibble.print_min = Inf)总是显示所有行。
  • 使用 options(tibble.width = Inf) 总是输出所有列,不管屏幕宽度。

你可以使用 package?tibble查看所有的选项列表。

最后的选项是使用RStudio内置的数据查看器,然后滚动查看数据集内容,可以把它用在操作链的末尾:

nycflights13::flights %>% 
  View()

10.3.2 取子集

如果你想要取出特定列,我们使用 $ and [[[[根据名字或位置;$仅根据名字。

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

想要把上述用于管道,需要使用占位符.:

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,tibbles更加严格:它从不执行部分匹配,并且在你想要获取不存在列时回抛出警告。

与旧代码交互

一些旧函数不能使用tibbles,这时候你可以使用as.data.frame()将tibble转换回数据框:

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

from

【r<-数据整理】tibbles_第1张图片

你可能感兴趣的:(【r<-数据整理】tibbles)