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

Chi*_*cht 14 terminology r dplyr tidyverse tibble

我记得读书的地方,as.tibble()是一个别名as_data_frame(),但我不知道到底是什么的别名是在编程术语.它与包装器类似吗?

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

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

df <- tbl_df(df)
Run Code Online (Sandbox Code Playgroud)

岂不

df <- as_data_frame(df)
Run Code Online (Sandbox Code Playgroud)

做同样的事?如果是这样,是否存在其他两种功能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().

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

rsm*_*h54 13

要回答你的问题"它是否令人困惑",我想是这样:).

as.tibble并且as_tibble是一样的; 两者都只是调用S3方法as_tibble:

> as.tibble
function (x, ...) 
{
    UseMethod("as_tibble")
}
<environment: namespace:tibble>
Run Code Online (Sandbox Code Playgroud)

as_data_frame而且tbl_df并不完全一样; tbl_df来电as_data_frame:

> tbl_df
function (data) 
{
    as_data_frame(data)
}
<environment: namespace:dplyr>
Run Code Online (Sandbox Code Playgroud)

tbl_dfdplyr同时as_data_frametibble包装:

> as_data_frame
function (x, ...) 
{
    UseMethod("as_data_frame")
}
<environment: namespace:tibble>
Run Code Online (Sandbox Code Playgroud)

但当然它调用相同的功能,所以它们是"相同的",或者你说的别名.

现在,我们可以看看泛型方法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
Run Code Online (Sandbox Code Playgroud)

如果您查看代码 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>
Run Code Online (Sandbox Code Playgroud)

as_data_frame.grouped_df取消组合传递数据帧.

总的来说,似乎as_data_frame应该被视为提供额外的功能as_tibble,除非您正在处理tspoly对象.

  • 我使用```functionName```(注意没有括号),```methods(functionName)```,```getAnywhere(functionName.classMethodName)```的组合,直接看``` tibble```和```dplyr```源代码. (2认同)