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

16

我记得在某个地方读到过 as.tibble()as_data_frame() 的一个别名,但我不知道在编程术语中 alias 到底是什么意思。它是否类似于一个包装器?

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

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

df <- tbl_df(df)

不会

df <- as_data_frame(df)

是否可以通过tbl_df()as_data_frame()这两个函数得到相同的结果?如果是,是否存在其他情况不能替换使用这两个函数来获得相同的结果?

R文档指出:

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

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

如果这四个函数确实都是相同的函数,那么为什么要给一个函数四个不同的名称?这难道不是更加混乱而非有用吗?

2个回答

14
回答你的问题,“是否令人困惑”,我认为是的 :)。 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
如果您查看 as_tibble 的代码,您会发现许多 as_data_frame 方法的定义。 as_tibble 定义了两个额外的方法,而这两个方法并没有为 as_data_frame 定义,它们分别是 as_tibble.tsas_tibble.poly。我不太确定为什么它们也不能为 as_data_frame 定义。 as_data_frame 还有两个额外的方法,它们都在 dplyr 中定义: as_data_frame.tbl_cubeas_data_frame.grouped_dfas_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 取消分组的时候。

总体而言,除非您处理 tspoly 对象,否则应将 as_data_frame 视为提供比 as_tibble 更多的功能。


只有一个后续问题:您如何检查函数的代码?它们不是用C++编写的吗?这会防止在R中查看它们。 - Chill2Macht
2
我使用了 functionName(注意没有括号)、methods(functionName)getAnywhere(functionName.classMethodName) 以及直接查看 tibbledplyr 源代码的组合。 - rsmith54
是的,它们在 GitHub 上。 - rsmith54
1
这个答案的一些元素现在已经过时了,as_data_frame 已经被软弃用,只是调用 as_tibble(它不再是通用的),tbl_df 调用 as_tibble(data, .name_repair = "check_unique")as.tibble 已经被软弃用。 - moodymudskipper
1
as_tibble现在也会抛出弃用警告。 - Simon Woodward

1
根据tibble介绍,似乎tibble代替了tbl_df

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

[...]此软件包从dplyr中提取出与tbl_df类相关的函数。

为了增加混淆,tbl_df现在调用as_tibble,这是as_data_frameas.tibble的首选别名:(Hadley Wickham对此问题的评论,以及as_tibble文档
> 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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接