【问题标题】:What is the difference between as.tibble(), as_data_frame(), and tbl_df()?as.tibble()、as_data_frame() 和 tbl_df() 有什么区别?
【发布时间】:2017-10-12 01:04:41
【问题描述】:

我记得在某处读到as.tibble()as_data_frame()别名,但我不知道在编程术语中别名 到底是什么。是不是类似于包装器?

所以我想我的问题可能归结为tbl_df()as_data_frame() 之间可能用法的差异:它们之间有什么区别,如果有的话?

更具体地说,给定一个(非 tibble)数据框 df,我经常使用以下方法将其变成一个 tibble:

df <- tbl_df(df)

不会

df <- as_data_frame(df)

做同样的事情?如果是这样,是否还有其他情况,两个函数 tbl_df()as_data_frame() 不能互换使用以获得相同的结果?

R documentation 这么说

tbl_df() 将参数转发给as_data_frame()

这是否意味着tbl_df()as_data_frame() 的包装器或别名? R 文档似乎没有提到任何关于 as.tibble() 的内容,而且我忘记了在哪里读到它是 as_data_frame() 的别名。另外,apparentlyas_tibble()as_data_frame() 的另一个别名。

如果这四个函数真的都是同一个函数,那么给一个函数四个不同的名字有什么意义呢?这不是更令人困惑而不是有用吗?

【问题讨论】:

    标签: r dplyr terminology tidyverse tibble


    【解决方案1】:

    根据introduction to tibble,似乎小标题取代了tbl_df

    我很高兴地宣布 tibble,这是一个用于在 R 中操作和打印数据帧的新软件包。Tibbles 是对 data.frame 的现代重新构想,保留已证明有效的时间,并丢弃无效的时间。该名称来自 dplyr:最初您使用 tbl_df() 创建这些对象,最容易发音为“tibble diff”。

    [...]这个包从dplyr中提取出tbl_df类相关函数。

    为了增加混乱,tbl_df 现在调用as_tibble,这是as_data_frameas.tibble 的首选别名:(Hadley Wickham's comment on the issueas_tibble docs

    > tbl_df
    function (data) 
    {
        as_tibble(data, .name_repair = "check_unique")
    }
    

    根据tbl_df() 的帮助说明,已弃用,应改用tibble::as_tibble()as_data_frameas.tibble 帮助页面都重定向到 as_tibble

    在 tibble 上调用 class 时,类名仍显示为 tbl_df

    > as_tibble(mtcars) %>% class
    [1] "tbl_df"     "tbl"        "data.frame"
    

    【讨论】:

      【解决方案2】:

      要回答您“是否令人困惑”的问题,我想是这样的:)。

      as.tibbleas_tibble是一样的;两者都简单地调用 S3 方法as_tibble:

      > as.tibble
      function (x, ...) 
      {
          UseMethod("as_tibble")
      }
      <environment: namespace:tibble>
      

      as_data_frametbl_df 不完全相同; tbl_df 致电as_data_frame

      > tbl_df
      function (data) 
      {
          as_data_frame(data)
      }
      <environment: namespace:dplyr>
      

      注意tbl_dfdplyr 中,而as_data_frametibble 包中:

      > as_data_frame
      function (x, ...) 
      {
          UseMethod("as_data_frame")
      }
      <environment: namespace:tibble>
      

      但当然它调用相同的函数,所以它们是“相同的”,或者你说的别名。

      现在,我们可以看看泛型方法as_tibbleas_data_frame 之间的区别。首先,我们看一下各自的方法:

      > methods(as_tibble)
      [1] as_tibble.data.frame* as_tibble.default*    as_tibble.list* as_tibble.matrix*     as_tibble.NULL*      
      [6] as_tibble.poly*       as_tibble.table*      as_tibble.tbl_df* as_tibble.ts*        
      see '?methods' for accessing help and source code
      > methods(as_data_frame)
      [1] as_data_frame.data.frame* as_data_frame.default*  as_data_frame.grouped_df* as_data_frame.list*      
      [5] as_data_frame.matrix*     as_data_frame.NULL*       as_data_frame.table*      as_data_frame.tbl_cube*  
      [9] as_data_frame.tbl_df*    
      see '?methods' for accessing help and source code
      

      如果您查看code for as_tibble,您还可以看到许多as_data_frame 方法的定义。 as_tibble 定义了两个未为 as_data_frameas_tibble.tsas_tibble.poly 定义的附加方法。我不太确定为什么不能为as_data_frame 定义它们。

      as_data_frame 有两个额外的方法,它们都在dplyr 中定义:as_data_frame.tbl_cubeas_data_frame.grouped_df

      as_data_frame.tbl_cube 使用as.data.frame 的较弱检查(是的,请耐心等待)然后调用as_data_frame

      > getAnywhere(as_data_frame.tbl_cube)
      function (x, ...) 
      {
          as_data_frame(as.data.frame(x, ..., stringsAsFactors = FALSE))
      }
      <environment: namespace:dplyr>
      

      as_data_frame.grouped_df 取消分组传递的数据帧。

      总的来说,as_data_frame 似乎应该被视为提供了比as_tibble 更多的功能,除非您正在处理tspoly 对象。

      【讨论】:

      • 只是一个后续:你如何检查函数的代码?它们不是用 C++ 编写的,因此无法在 R 中查看吗?
      • 我使用了functionName(注意没有括号)、methods(functionName)getAnywhere(functionName.classMethodName)的组合,直接看tibbledplyr源代码。
      • 是的,他们在 github 上。
      • 这个答案的一些元素现在已经过时了,as_data_frame 被软性弃用,只调用as_tibble(它不再是通用的),tbl_df 调用as_tibble(data, .name_repair = "check_unique")as.tibble 已软弃用
      • as_tibble 现在还会引发弃用警告。
      猜你喜欢
      • 2019-01-15
      • 2015-05-02
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      • 2011-02-25
      • 2011-11-22
      相关资源
      最近更新 更多