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

标签 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() forwards the argument to as_data_frame()

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

如果这四个函数确实都是同一个函数,那么给一个函数赋予四个不同的名称有什么意义呢?这不是更令人困惑而不是有帮助吗?

最佳答案

回答你的“是否令人困惑”的问题,我想是的:)。

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位于dplyras_data_frame位于 tibble封装:

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

但当然它调用相同的函数,因此它们是“相同的”,或者如您所说的别名。

现在,我们可以看看泛型方法 as_tibble 之间的差异和as_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_frame 定义的附加方法, as_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对象。

关于r - as.tibble()、as_data_frame() 和 tbl_df() 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43942328/

相关文章:

R 没有工作区但分配了 2+GB 的内存?

r - 如何在R中将数据集转换为逻辑数据框?

r - 在 dplyr 中取消列出包含日期列表的列

c++ - const-pointer-to-type、pointer-to-const 和 const 讨论的术语

web-applications - 网站和网络应用程序有什么区别?

r - 在函数中调用其他列的控制流程

python - 在 R 中使用 Arules 生成 2 项集规则

r - Dplyr 使用字符串变量作为表达式重命名

r - 在 R 中,如何更改行和列的位置?

sql - 什么是索引?非聚集索引可以是非唯一的吗?