web-dev-qa-db-fra.com

Quelle est la différence entre as.tibble (), as_data_frame () et tbl_df ()?

Je me souviens d'avoir lu quelque part que as.tibble() est un alias pour as_data_frame(), mais je ne sais pas ce qu'est exactement un alias dans la terminologie de programmation. Est-ce similaire à un emballage?

Donc, je suppose que ma question concerne probablement la différence d’usages possibles entre tbl_df() et as_data_frame(): quelles sont les différences entre elles, le cas échéant?

Plus précisément, étant donné un cadre de données (non-tibble) df, je le transforme souvent en tibble en utilisant:

df <- tbl_df(df)

Ne serait pas 

df <- as_data_frame(df)

faire la même chose? Si tel est le cas, existe-t-il d'autres cas où les deux fonctions tbl_df() et as_data_frame() ne peuvent pas être utilisées de manière interchangeable pour obtenir le même résultat?

La documentation R dit que

tbl_df() transmet l'argument à as_data_frame()

cela signifie-t-il que tbl_df() est un wrapper ou un alias pour as_data_frame()? R documentation ne semble rien dire à propos de as.tibble() et j'ai oublié où j'ai lu que c'était un alias pour as_data_frame(). De plus, apparemmentas_tibble() est un autre alias de as_data_frame().

Si ces quatre fonctions sont vraiment toutes identiques, quel est le sens de donner à une fonction quatre noms différents? N'est-ce pas plus déroutant qu'utile?

13
Chill2Macht

Pour répondre à votre question de "si c'est déroutant", je pense que oui :).

as.tibble et as_tibble sont identiques; les deux appellent simplement la méthode S3 as_tibble:

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

as_data_frame et tbl_df ne sont pas exactement les mêmes; tbl_df appelle as_data_frame:

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

Remarque: tbl_df est dans dplyr alors que as_data_frame est dans le package tibble:

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

mais bien sûr, cela appelle la même fonction, donc ce sont "les mêmes", ou alias comme vous le dites.

Nous pouvons maintenant examiner les différences entre les méthodes génériques as_tibble et as_data_frame. Premièrement, nous examinons les méthodes de chacun:

> 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

Si vous extrayez le code pouras_tibble, vous pouvez également voir les définitions de la plupart des méthodes as_data_frame. as_tibble définit deux méthodes supplémentaires qui ne sont pas définies pour as_data_frame, as_tibble.ts et as_tibble.poly. Je ne sais pas vraiment pourquoi ils ne pourraient pas être définis aussi pour as_data_frame.

as_data_frame a deux méthodes supplémentaires, qui sont toutes deux définies dans dplyr: as_data_frame.tbl_cube et as_data_frame.grouped_df.

as_data_frame.tbl_cube utilisez la vérification plus faible de as.data.frame (oui, gardez-la avec moi) pour appeler ensuite as_data_frame:

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

tandis que as_data_frame.grouped_df dissocie la trame de données transmise.

Globalement, il semble que as_data_frame devrait être considéré comme fournissant des fonctionnalités supplémentaires par rapport à as_tibble, sauf si vous utilisez des objets ts ou poly

12
rsmith54

Selon le introduction à tibble , il semble que les tibbles remplacent tbl_df

J’ai le plaisir d’annoncer que tibble, un nouveau logiciel de manipulation et d’impression de trames de données chez R. Tibbles, est une réinvention moderne du nom data.frame, qui permet de conserver le temps qui s’est avéré efficace et de jeter ce qui n’est pas. Le nom vient de dplyr: à l'origine, vous aviez créé ces objets avec tbl_df(), qui était plus facilement prononcé comme «tibble diff». 

[...] Ce paquet extrait les fonctions associées à la classe tbl_df de dplyr.

Pour ajouter à la confusion, tbl_df appelle maintenant as_tibble, qui est l'alias préféré pour as_data_frame et as.tibble: ( Le commentaire de Hadley Wickham sur le problème , et as_tibble docs )

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

Selon la description de l'aide de tbl_df(), il est obsolète et tibble::as_tibble() doit être utilisé à la place. Les pages d’aide as_data_frame et as.tibble redirigent toutes les deux vers as_tibble

Lorsque vous appelez class sur un tibble, le nom de la classe apparaît toujours sous la forme tbl_df:

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