web-dev-qa-db-ja.com

as.tibble()、as_data_frame()、およびtbl_df()の違いは何ですか?

as.tibble()as_data_frame()aliasであることをどこかで読んだことを覚えていますが、正確に何がわからないのですかaliasはプログラミング用語です。ラッパーに似ていますか?

だから私の質問は、おそらくtbl_df()as_data_frame()の可能な使用法の違いに帰着すると思います:もしあれば、それらの違いは何ですか?

より具体的には、(非チブル)データフレームdfが与えられた場合、私はしばしば以下を使用してそれをチブルに変えます:

_df <- tbl_df(df)
_

しません

_df <- as_data_frame(df)
_

同じことをしますか?その場合、2つの関数tbl_df()as_data_frame()を同じ結果を得るために互換的に使用できない他のケースはありますか?

R documentation

tbl_df()は引数をas_data_frame()に転送します

それは、tbl_df()as_data_frame()のラッパーまたはエイリアスであることを意味しますか? Rのドキュメントはas.tibble()について何も言っていないようで、それがas_data_frame()のエイリアスであることをどこで読んだか忘れていました。また、 明らかにas_tibble()as_data_frame()の別名です。

これら4つの関数がすべて同じ関数である場合、1つの関数に4つの異なる名前を付ける意味は何ですか?それは役立つよりも混乱しませんか?

14
Chill2Macht

「混乱しているかどうか」というあなたの質問に答えるために、私はそう思う:)。

as.tibbleas_tibbleは同じです。両方とも、単にS3メソッドas_tibbleを呼び出します。

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

as_data_frametbl_dfはまったく同じではありません。 tbl_dfas_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

code foras_tibbleをチェックアウトすると、多くのas_data_frameメソッドの定義も確認できます。 as_tibbleは、as_data_frameas_tibble.ts、およびas_tibble.polyに対して定義されていない2つの追加メソッドを定義します。 as_data_frameにも定義できない理由はよくわかりません。

as_data_frameには2つの追加メソッドがあり、両方ともdplyrで定義されています:as_data_frame.tbl_cubeおよびas_data_frame.grouped_df

as_data_frame.tbl_cubeas.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>

while as_data_frame.grouped_dfは渡されたデータフレームをグループ解除します。

全体として、as_data_frameは、tsまたはpolyオブジェクトを処理している場合を除き、as_tibbleに追加機能を提供するものと見なされるようです。

12
rsmith54

tibbleの紹介 によれば、tibblesは_tbl_df_に取って代わるようです。

Rのデータフレームを操作および印刷するための新しいパッケージであるtibbleを発表します。Tibblesは、data.frameの最新の再考であり、有効であることが証明された時間を保持し、そうでないものは破棄します。名前はdplyrに由来します。最初は、これらのオブジェクトをtbl_df()で作成しました。これは「tibble diff」と最も簡単に発音されました。

[...]このパッケージは、dplyrから関数に関連するtbl_dfクラスを抽出します。

混乱を増すために、_tbl_df_は_as_tibble_と_as_data_frame_の優先エイリアスである_as.tibble_を呼び出すようになりました:( Hadley Wickhamの問題に関するコメント =、および as_tibble docs

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

tbl_df()のヘルプの説明によると、これは非推奨であり、代わりにtibble::as_tibble()を使用する必要があります。 _as_data_frame_および_as.tibble_ヘルプページは両方とも_as_tibble_にリダイレクトします。

ティブルでclassを呼び出すと、クラス名は引き続き_tbl_df_として表示されます。

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