it-swarm.dev

Was ist der Unterschied zwischen as.tibble (), as_data_frame () und tbl_df ()?

Ich erinnere mich, dass ich irgendwo gelesen habe, dass as.tibble() ein alias für as_data_frame() ist, aber ich weiß nicht, was genau ein alias in der Programmierterminologie ist. Ist es einem Wrapper ähnlich?

Ich denke, meine Frage beruht wahrscheinlich auf dem Unterschied in den möglichen Verwendungen zwischen tbl_df() und as_data_frame(): Was sind die Unterschiede zwischen ihnen, wenn überhaupt?

Genauer gesagt, wenn ich einen (nicht tibble) Datenrahmen df benutze, verwende ich ihn oft in ein tibble, indem ich Folgendes verwendet:

df <- tbl_df(df)

Würde nicht 

df <- as_data_frame(df)

mach das selbe? Wenn ja, gibt es andere Fälle, in denen die beiden Funktionen tbl_df() und as_data_frame() nicht austauschbar verwendet werden können, um dasselbe Ergebnis zu erzielen?

Die R Dokumentation sagt das

tbl_df() leitet das Argument an as_data_frame() weiter

bedeutet das, dass tbl_df() ein Wrapper oder Alias ​​für as_data_frame() ist? R-Dokumentation scheint nichts über as.tibble() zu sagen, und ich habe vergessen, wo ich gelesen habe, dass es ein Alias ​​für as_data_frame() war. anscheinendas_tibble() ist ein weiterer Alias ​​für as_data_frame().

Wenn diese vier Funktionen wirklich alle die gleiche Funktion haben, was ist der Sinn, einer Funktion vier verschiedene Namen zu geben? Ist das nicht verwirrender als hilfreich?

13
Chill2Macht

Um Ihre Frage zu beantworten "ob es verwirrend ist", denke ich :).

as.tibble und as_tibble sind gleich; beide rufen einfach die S3-Methode as_tibble auf:

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

as_data_frame und tbl_df stimmen nicht genau überein; tbl_df ruft as_data_frame auf:

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

Hinweis tbl_df befindet sich in dplyr, während as_data_frame im Paket tibble enthalten ist:

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

aber natürlich ruft es dieselbe Funktion auf, also sind sie "gleich" oder Aliase wie Sie sagen.

Nun können wir die Unterschiede zwischen den generischen Methoden as_tibble und as_data_frame betrachten. Zuerst betrachten wir die Methoden von jedem:

> 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

Wenn Sie den code füras_tibble auschecken, können Sie auch die Definitionen für viele der as_data_frame-Methoden sehen. as_tibble definiert zwei zusätzliche Methoden, die nicht für as_data_frame, as_tibble.ts und as_tibble.poly definiert sind. Ich bin mir nicht wirklich sicher, warum sie nicht auch für as_data_frame definiert werden konnten.

as_data_frame verfügt über zwei zusätzliche Methoden, die beide in dplyr definiert sind: as_data_frame.tbl_cube und as_data_frame.grouped_df.

as_data_frame.tbl_cube benutze die schwächere Überprüfung von as.data.frame (ja, bleib bei mir) und rufe dann as_data_frame auf:

> getAnywhere(as_data_frame.tbl_cube)
function (x, ...) 
{
    as_data_frame(as.data.frame(x, ..., stringsAsFactors = FALSE))
}
<environment: namespace:dplyr>

während as_data_frame.grouped_df den übergebenen Datenrahmen aufhebt.

Insgesamt scheint es, dass as_data_frame als zusätzliche Funktionalität über as_tibble betrachtet werden sollte, es sei denn, es handelt sich um ts- oder poly-Objekte. 

12
rsmith54

Nach der Einführung in tibble scheint es so, als ob tibbles tbl_df ersetzt werden. 

Ich freue mich, tibble ankündigen zu können, ein neues Paket zur Bearbeitung und zum Ausdrucken von Datenrahmen in R. Tibbles ist eine moderne Neugestaltung des data.frame, die Beibehaltung der Zeit hat sich als effektiv erwiesen, und das Herausnehmen was nicht möglich ist. Der Name stammt von dplyr: Sie haben diese Objekte ursprünglich mit tbl_df() erstellt, das am leichtesten als "tibble diff" ausgesprochen wurde. 

[...] Dieses Paket extrahiert die mit der tbl_df-Klasse verknüpften Funktionen aus dplyr.

tbl_df ruft jetzt as_tibble auf. Dies ist der bevorzugte Alias ​​für as_data_frame und as.tibble: ( Kommentar von Hadley Wickham zum Problem , und as_tibble docs )

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

Gemäß der Hilfebeschreibung von tbl_df() ist es veraltet und sollte stattdessen tibble::as_tibble() verwendet werden. as_data_frame- und as.tibble-Hilfeseiten leiten beide zu as_tibble um. 

Beim Aufruf von class für ein Tibbel wird der Klassenname weiterhin als tbl_df angezeigt:

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