【上一篇:27.总结Explore和资源推荐】
【下一篇:29.关于tibble和data.frame之二】
tibble是一种更现代的数据框。tibble和传统data.frame之间的相互转换用as_tibble()、as.data.frame()函数实现。查看tibble的简介用vignette("tibble")。
1. tibble的创建
1) data.frame()函数用于创建传统的数据框,tibble()函数用于创建tibble。后者可以直接引用以创建的变量生成新变量,data.frame()不可以。
tibble(
x = 1:5,
y = 1,
z = x ^ 2 + y
)
2) tibble()可以用non-syntactic name创建数据框,但要用``括起来,这样的数据框去做subsetting和绘图的时候,也要注意用``括起来。取子集的时候也注意加上``。
(tb <- tibble(
`:)` = "smile",
` ` = "space",
`2000` = "number"
))
# A tibble: 1 x 3
`:)` ` ` `2000`
<chr> <chr> <chr>
1 smile space number
# 猜猜换成data.frame()会是什么效果
(tb <- data.frame(
`:)` = "smile",
` ` = "space",
`2000` = "number"
))
X.. X. X2000
1 smile space number
tibble的格式之前简要说过,见:11.数据转换之了解一些R包和数据集用于学习和练习
3) 用tribble()函数创建transposed tibble。
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
2. tibble()函数和data.frame()函数的不同之一
首先,看两个函数的Usage:
# tibble()函数
tibble(
...,
.rows = NULL,
.name_repair = c("check_unique", "unique", "universal", "minimal")
)
###
tibble_row(
...,
.name_repair = c("check_unique", "unique", "universal", "minimal")
)
# data.frame()函数
data.frame(..., row.names = NULL, check.rows = FALSE,
check.names = TRUE, fix.empty.names = TRUE,
stringsAsFactors = FALSE)
tibble()函数的功能比data.frame()少,tibble()函数不会改变数据的类型(例如,将字符串转成因子);也不会改变变量名;也从不创建行名。
1. data.frame()函数有个stringsAsFactors参数,可以控制要不要把字符串向量转成因子。tibble()函数没有这个功能。
2. data.frame()函数创建数据框,变量名必须是syntactic name,例如不能以数字开头,如果以数字开头会自动加个X,也不能是纯数字;而tibble()的变量名是non-syntactic name,你创建时候用的啥生成的就是啥,而且还可以是纯数字,还可以是空。例如:
# 两者有一些相同点,即参数形式是tag = value或者 value
# 两者在value长度为1时,都可以自动填充,也只有这种情况。多个tag对应的value长度不一致的话,会直接报错
# tag=value,tag将作为变量名展示
data.frame(a=1:5,b=LETTERS[1:5],c=letters[1:5])
tibble(a=1:5,b=LETTERS[1:5],c=letters[1:5])
上面两个得到的变量名是一样的
# value,下面这种情况,data.frame()将改变变量名,而tibble()不会
data.frame(1:5,LETTERS[1:5],letters[1:5])
tibble(1:5,LETTERS[1:5],letters[1:5])
> data.frame(1:5,LETTERS[1:5],letters[1:5])
X1.5 LETTERS.1.5. letters.1.5.
1 1 A a
2 2 B b
3 3 C c
4 4 D d
5 5 E e
# tibble()中,non-syntactic name是用``括起来的
> tibble(1:5,LETTERS[1:5],letters[1:5])
# A tibble: 5 x 3
`1:5` `LETTERS[1:5]` `letters[1:5]`
<int> <chr> <chr>
1 1 A a
2 2 B b
3 3 C c
4 4 D d
5 5 E e
# 其实就一句话,tibble()可以用``解决non-syntatic name的问题,data.frame()不行
tibble(`1`=1:10,`2`=11:20)
data.frame(`1`=1:10,`2`=11:20)
> data.frame(`1`=1:5,`2`=11:15)
X1 X2
1 1 11
2 2 12
3 3 13
4 4 14
5 5 15
# value长度为1,自动填充见下图

3. data.frame()有个参数raw.names,可以用一个数字或一个字符串(这个字符串是变量名)指定哪一列作为行名,也可以是一个字符向量或整数向量,向量的值作为行名。而tibble()生成的数据框的行名永远是数字而且不能用rownames()函数改变行名。

部分理解可能不对,欢迎指正!
网友评论