16

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

所以我想我的问题可能归结为tbl_df()and之间可能用法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().

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

4

2 回答 2

14

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

as.tibble并且as_tibble是相同的;两者都简单地调用 S3 方法as_tibble

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

as_data_frame并且tbl_df不完全相同;tbl_df调用as_data_frame

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

注意tbl_df在包装dplyras_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.ts方法as_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对象。

于 2017-05-12T19:34:03.853 回答
1

根据对 tibble 的介绍,似乎 tibbles 被取代了tbl_df

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

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

为了增加混乱,tbl_df现在调用as_tibble,这是as_data_frameand的首选别名as.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.

调用classtibble 时,类名仍显示为tbl_df

> as_tibble(mtcars) %>% class
[1] "tbl_df"     "tbl"        "data.frame"
于 2018-11-28T20:26:00.427 回答