美文网首页
29.关于tibble和data.frame之二

29.关于tibble和data.frame之二

作者: 心惊梦醒 | 来源:发表于2021-08-13 01:55 被阅读0次

    【上一篇:28.关于tibble和data.frame之一】
    【下一篇:30.关于readr包里的read系列函数】

    3. tibble()函数和data.frame()函数的不同之二

        1) 在print上的不同。传统的数据框,print之后展示所有的行和列,tibble的print只展示前十行,列会适应屏幕展示。

    > nycflights13::flights %>% print()
    # A tibble: 336,776 x 19
        year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
       <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
     1  2013     1     1      517            515         2      830            819
     2  2013     1     1      533            529         4      850            830
     3  2013     1     1      542            540         2      923            850
     4  2013     1     1      544            545        -1     1004           1022
     5  2013     1     1      554            600        -6      812            837
     6  2013     1     1      554            558        -4      740            728
     7  2013     1     1      555            600        -5      913            854
     8  2013     1     1      557            600        -3      709            723
     9  2013     1     1      557            600        -3      838            846
    10  2013     1     1      558            600        -2      753            745
    # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
    #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
    #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
    #   time_hour <dttm>
    

        可设置print的参数控制打印:

    # 打印20行,列全部打印
    nycflights13::flights %>% print(n = 20, width = Inf)
    

        对tibble,可以用options()函数进行全局打印设置(一经设置,永久有效):

    #设置最小打印行数和最大打印行数,如果tibble有>n行,则只打印m行
    options(tibble.print_max = n, tibble.print_min = m)
    #设置打印所有行
    options(tibble.print_min = Inf)
    #打印所有的列
    options(tibble.width = Inf)
    

        2) 取列的子集的两个新工具$[[。tibble取子集对变量名较严格。

    $后直接跟变量名
    [[数字或者变量名]]  #变量名要用双引号括起来
    
    取子集的不同

        data.frame取一列不返回向量的方法:

    > df<-data.frame(a=1:10,b=letters[1:10],c=runif(10))
    > df[1]
        a
    1   1
    2   2
    3   3
    4   4
    5   5
    6   6
    7   7
    8   8
    9   9
    10 10
    > df[[1]]
     [1]  1  2  3  4  5  6  7  8  9 10
    > df[,1]
     [1]  1  2  3  4  5  6  7  8  9 10
    
    4. 其他小知识

        1) 假设将变量名存到一个对象中,如何用这个对象把变量的值从tibble中取出来。

    > var<-'a'
    > df<-tibble(a=1:10,b=letters[1:10],c=runif(10))
    > df[[var]]
     [1]  1  2  3  4  5  6  7  8  9 10
    > df[["a"]]
     [1]  1  2  3  4  5  6  7  8  9 10
    

        2) 一种特殊的占位符" . "可以在pip中使用:

    df %>% .[[var]]
    df %>% .$a
    

        3) tibble.enframe()函数可以将向量转成tibble,其他更多功能见帮助文档。

    enframe(1:3)
    

        4) 解引用表达式

    > x <- 3
    > tibble(x = 1, y = x)
    # A tibble: 1 x 2
          x     y
      <dbl> <dbl>
    1     1     1
    > tibble(x = 1, y = !!x)
    # A tibble: 1 x 2
          x     y
      <dbl> <dbl>
    1     1     3
    
    4. 很重要的总结

        1. 对tibble中的列名(也就是变量名),能用non-syntactic name,其实就是用``将name括起来了,没啥大不了的。但要注意的是,使用的时候,不管是取子集、运算、绘图,都要用``括起来后才能正常使用。data.frame中跟列名有关的参数是:

    stringsAsFactors:逻辑值,默认为FALSE,是否将字符串向量转成因子
    check.names:逻辑值,默认TRUE,检查列名确认其符合syntactic,且是unique的。
    > (df<-data.frame(1:10,letters[1:10],runif(10),check.names = T))
       X1.10 letters.1.10.  runif.10.
    1      1             a 0.81224026
    2      2             b 0.07225875
    3      3             c 0.64121344
    4      4             d 0.71966993
    5      5             e 0.36557231
    6      6             f 0.85513545
    7      7             g 0.45942457
    8      8             h 0.15722427
    9      9             i 0.41453395
    10    10             j 0.90570964
    > (df<-data.frame(1:10,letters[1:10],runif(10),check.names = F,fix.empty.names = F))
                      
    1   1 a 0.39641492
    2   2 b 0.39382357
    3   3 c 0.05149723
    4   4 d 0.94000301
    5   5 e 0.59156748
    6   6 f 0.60415162
    7   7 g 0.79627461
    8   8 h 0.37756130
    9   9 i 0.35011473
    10 10 j 0.78170703
    
    fix.empty.names:逻辑值,默认为TRUE,表示如果构建数据框的时候形式是value
    (不是tag=value),就给个constructed name;如果是FLASE,就给空。此时check.names应该为FALSE
    > (df<-data.frame(1:10,letters[1:10],runif(10),check.names = F))
       1:10 letters[1:10]   runif(10)
    1     1             a 0.394257475
    2     2             b 0.620495489
    3     3             c 0.330593479
    4     4             d 0.001414736
    5     5             e 0.585622990
    6     6             f 0.732553757
    7     7             g 0.612864199
    8     8             h 0.690226531
    9     9             i 0.055589493
    10   10             j 0.997872859
    

        2. 对行名,tibble的行名不可变,data.frame的可以用rawnames()函数设置。data.frame()函数中与行名有关的参数是:

    row.names:默认为NULL,也就是不指定行名,指定的方法上一篇说过了
    check.rows:逻辑值,默认为FALSE,检查行长度和名称的一致性  #此参数,费解
    

        3. 最重要的一点,看完每个函数的Usage,决定前面的理解并不正确。但,第一遍学习,常学常新!!!
        4.记住主要参数,细节需要的时候再深究。
        很高兴遇见这本书,打通了之前的很多关卡。学得很难,但会坚持。

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

    【上一篇:28.关于tibble和data.frame之一】
    【下一篇:30.关于readr包里的read系列函数】

    相关文章

      网友评论

          本文标题:29.关于tibble和data.frame之二

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