as.tibble(),as_data_frame()和tbl_df()之间有什么区别?

时间:2017-05-12 16:19:32

标签: r dplyr terminology tidyverse tibble

我记得曾在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()的别名。另外,apparently as_tibble()as_data_frame()的另一个别名。

如果这四个函数的功能完全相同,那么赋予一个函数四个不同名称的意义是什么?这不是更有说服力而不是有用吗?

2 个答案:

答案 0 :(得分:12)

回答你的问题&#34;是否令人困惑&#34;,我想是这样:)。

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_df位于dplyr,而as_data_frame位于tibble包中:

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

但当然它会调用相同的功能,因此它们与你说的相同&#34;或别名。

现在,我们可以看一下通用方法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个对象。

答案 1 :(得分:0)

根据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 issue和{{ 3}})

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

根据tbl_df()的帮助描述,不建议使用它,而应使用tibble::as_tibble()as_data_frameas.tibble帮助页面都重定向到as_tibble

在小标题上调用class时,类名仍显示为tbl_df

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