美文网首页
28.关于tibble和data.frame之一

28.关于tibble和data.frame之一

作者: 心惊梦醒 | 来源:发表于2021-08-12 23:45 被阅读0次

【上一篇: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()函数改变行名。

数据框中的行名和列名

    部分理解可能不对,欢迎指正!

【上一篇:27.总结Explore和资源推荐】
【下一篇:29.关于tibble和data.frame之二】

相关文章

网友评论

      本文标题:28.关于tibble和data.frame之一

      本文链接:https://www.haomeiwen.com/subject/ryenvltx.html