使用tibble实现简单数据框

目录

️简介

创建tibble

对比tibble与data.frame

打印

取子集

与旧代码进行交互 

练习


精华都在实战代码中

简介

tibble 是一种简单数据框,它对传统数据框的功能进 行了一些修改,以便更易于使用。R 是一门古老的语言,其中有些功能在 10 年或 20 年前是适用的,但现在已经过时。在不破坏现有代码的前提下,很难修改 R 的基础功能,因此多数革新都是以扩展包的方式出现的。本章会介绍 tibble,其所提供的简单数据框更易于在tidyverse 中使用。
library(tidyverse)

创建tibble

由于多数其他 R 包使用的是标准数据框,因此你可能想要将数据框转换为 tibble。可以使 用 as_tibble() 函数来完成转换:
as_tibble(iris)

可以通过 tibble() 函数使用一个向量来创建新 tibble。tibble() 会自动重复长度为 1 的输 入,并可以使用刚刚创建的新变量,如下所示:
     tibble(
       x = 1:5,
       y = 1,
       z=x^2+ y
     )

Tibble columns must have compatible sizes.

可以在 tibble 中使用在 R 中无效的变量名称(即不符合语法的名称)作为列名称。例如, 列名称可以不以字母开头,也可以包含特殊字符(如空格)。要想引用这样的变量,需要 使用反引号 ` 将它们括起来:
     tb <- tibble(
       `:)` = "smile",
       ` ` = "space",
       `2000` = "number"
       )
tb
#> # A tibble: 1 × 3
#> `:)` ` ` `2000` 
#> <chr> <chr> <chr> 
#> 1 smile space number
如果要在 ggplot2 和 dplyr 等其他 R 包中使用这些变量,也需要使用反引号。

创建 tibble 的另一种方法是使用 tribble() 函数

tribble 是 transposed tibble(转置 tibble) 的缩写。tribble() 是定制化的,可以对数据按行进行编码:列标题由公式(以 ~ 开头) 定义,数据条目以逗号分隔,这样就可以用易读的方式对少量数据进行布局:
tribble(
~x, ~y, ~z, 
#--|--|---- 
"a", 2, 3.6, 
"b", 1, 8.5
     )
     #> # A tibble: 2 × 3
     #>       x     y     z
     #>   <chr> <dbl> <dbl>
     #> 1     a     2   3.6
     #> 2     b     1   8.5
通常会加一条注释(以 # 开头的行)来明确指出标题行的位置。

对比tibble与data.frame

打印

tibble的打印只显示前十行结果,而且列适应屏幕,tibble还会打印列的类型。

可以明确使用 print() 函数来打印数据框,并控制打印的行数(n)和显示的宽度 (width)。

width = Inf 可以显示出所有列:

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

 还可以通过设置以下选项来控制默认的打印方式。

• options(tibble.print_max = n, tibble.print_min = m):如果多于 m 行,则只打印出 n 行。

options(tibble.print_min = Inf) 表示总是打印所有行。

• options(tibble.width = Inf) 表示总是打印所有列,不考虑屏幕的宽度。

取子集

按名称提取

df$x

[[ 可以按名称或位置提取变量;$ 只能按名称提取变量

要想在管道中使用这些提取操作,需要使用特殊的占位符 .:
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

与旧代码进行交互 

旧函数不支持tibble的主要原因在于[ 的功能。对于R基础包中的数据框,[有时返回一个数据框,有时返回一个向量。对于tibble,[则总是返回另一个tibble。

class(as.data.frame(tb))
     #> [1] "data.frame"
有些旧函数不支持 tibble 

练习

  1.  用is_tibble()识别一个对象是否是tibble
  2. > df <- data.frame(abc = 1, xyz = "a")
    > df$x
    [1] "a"
    > df[,"xyz"]
    [1] "a"
    > df[,c("abc","xyz")]
      abc xyz
    1   1   a
    > df
      abc xyz
    1   1   a
    
    > df <- tibble(abc = 1, xyz = "a")
    > df$x
    NULL
    Warning message:
    Unknown or uninitialised column: `x`. 
    > df[,"xyz"]
    # A tibble: 1 × 1
      xyz  
      <chr>
    1 a    
    > df[,c("abc","xyz")]
    # A tibble: 1 × 2
        abc xyz  
      <dbl> <chr>
    1     1 a    
    > df
    # A tibble: 1 × 2
        abc xyz  
      <dbl> <chr>
    1     1 a    

    tibble能打印列的类型,查找更精

  3. > df[var] <- "mpg"
    Error in `vectbl_as_new_col_index()`:
    ! Must assign to columns with a valid subscript vector.
    ✖ Subscript `var` has the wrong type `function`.
    ℹ It must be logical, numeric, or character.
    Run `rlang::last_error()` to see where the error occurred.
    
    > df["var"] <- "mpg"
    
    > df
    # A tibble: 1 × 3
        abc xyz   var  
      <dbl> <chr> <chr>
    1     1 a     mpg  
    
    > df[3]
    # A tibble: 1 × 1
      var  
      <chr>
    1 mpg  
    
    > df["var"]
    # A tibble: 1 × 1
      var  
      <chr>
    1 mpg  
    
    > df[ncol = 3]
    # A tibble: 1 × 3
        abc xyz   var  
      <dbl> <chr> <chr>
    1     1 a     mpg  
      

 4.

> df <- tibble(abc = 1, xyz = "a", "1" = 1:5)

> df[4]
Error in `df[4]`:
! Can't subset columns past the end.
ℹ Location 4 doesn't exist.
ℹ There are only 3 columns.
Run `rlang::last_error()` to see where the error occurred.

> df[1]
# A tibble: 5 × 1
    abc
  <dbl>
1     1
2     1
3     1
4     1
5     1

> df["1"]
# A tibble: 5 × 1
    `1`
  <int>
1     1
2     2
3     3
4     4
5     5

> df$"1"
[1] 1 2 3 4 5

> df$1
Error: unexpected numeric constant in "df$1"
> df <- tibble(val1 = c(1,4,6,8,9,19), val2 = c(3,5,6,8,4,2))

> plot(df[1], df[2])
Error in stripchart.default(x1, ...) : 画图方法不对

> plot(df$val1, df$val2)
annoying <- tibble(
    `1` = 1:10
    `2` = `1` *2 + rnorm(length(`1`))
)

#提取名称为1的变量
#只有数值
annoying$`1`
#还是tibble
annoying[1]

#绘制表示变量1和变量2关系的散点图
plot(annoying$`1`, annoying$`2`)
#ggplot2画图默认有灰色背景和分割线
library(ggplot2)
ggplot(annoying, aes(`1`, `2`))+
    geom_point()

#创建一个名称为3的新列,其值为列2除以列1
annoying$`3` <- annoying$`2` / annoying$`3`

#将这些列重新命名为one、two和three
names(annoying) <- c("one", "two", "three")

5.

enframe() converts named atomic vectors or lists to one- or two-column data frames. For a list, the result will be a nested tibble with a column of type list. For unnamed vectors, the natural sequence is used as name column.

deframe() converts two-column data frames to a named vector or list, using the first column as name and the second column as value. If the input has only one column, an unnamed vector is returned.

### ** Examples

enframe(3:1)
# A tibble: 3 × 2
   name value
  <int> <int>
1     1     3
2     2     2
3     3     1

enframe(c(a = 5, b = 7))
# A tibble: 2 × 2
  name  value
  <chr> <dbl>
1 a         5
2 b         7

enframe(list(one = 1, two = 2:3, three = 4:6))
# A tibble: 3 × 2
  name  value    
  <chr> <list>   
1 one   <dbl [1]>
2 two   <int [2]>
3 three <int [3]>

deframe(enframe(3:1))
1 2 3 
3 2 1 

deframe(tibble(a = 1:3))
[1] 1 2 3

deframe(tibble(a = as.list(1:3)))
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

代码来自R关于enframe和deframe的帮助文档

6.width控制在tibble底部打印的额外列名称的数量。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看星星的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值