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