J'ai deux trames de données très similaires, que ggplot2
voit différemment; Bien que le contenu soit le même, les structures de données sont subtilement différentes. L'un est un data.frame
, l'autre un data_frame
. Je voudrais comprendre la différence dans la façon dont ggplot2
les voit. Dans les exemples suivants, les deux sont utilisés dans un stat_function
; le data.frame
génère des tracés tandis que data_frame
génère des erreurs. Ceci est particulièrement déroutant à la lumière de l'interopérabilité des paquets dans le Hadleyverse. J'ai d'abord rencontré ce problème lorsque j'ai découvert que je n'arrivais pas à créer une intrigue à partir d'un cadre de données produit par dplyr (dplyr transforme data.frames en data_frames) alors qu'un cadre de données que je pensais identique (il ne l'était pas, data.frame) a très bien fonctionné.Pourquoi ggplot2 voit-il différemment un fichier data.frame et un fichier data_frame?
Exemple 1
D'abord, la version de travail du data.frame
.
library(ggplot2)
library(dplyr)
d.f <- data.frame(mean = 0, sd = 1)
d_f <- data_frame(mean = 0, sd = 1)
ggplot(data.frame(x=-3:3), aes(x)) +
stat_function(fun = function (x) dnorm(x, mean = d.f[1,1], sd = d.f[1,2]))
Et maintenant, la version non-travail du data_frame
.
ggplot(data.frame(x=-3:3), aes(x)) +
stat_function(fun = function (x) dnorm(x, mean = d_f[1,1], sd = d_f[1,2]))
## Warning message:
## Computation failed in `stat_function()`:
## Non-numeric argument to mathematical function
Exemple 2
Cet exemple produit un message d'erreur différent mais peut-être la question sous-jacente est la même. Tout d'abord, la version de travail avec un data.frame
.
logistic <- function (x) { 1/(1 + exp(-x)) }
d.f <- data.frame(b0 = -9, b1 = 0.8)
d_f <- data_frame(b0 = -9, b1 = 0.8)
ggplot(data.frame(x=0:20), aes(x)) +
stat_function(fun = function (x) logistic(d.f[1,1] + d.f[1,2] * x))
Et voici la version non-travail avec un data_frame
.
ggplot(data.frame(x=0:20), aes(x)) +
stat_function(fun = function (x) logistic(d_f[1,1] + d_f[1,2] * x))
## Error in eval(expr, envir, enclos) : object 'y' not found
Essayez 'pull (d_f [1,2])'. C'est encore une machine après sous-ensemble. Mais ggplot attend un vecteur qui se corrige 'pull'. Jetez un coup d'oeil [ici] (https://stackoverflow.com/questions/21618423/extract-a-dplyr-tbl-column-as-a-vector) – Jimbou
Ce n'est pas ggplot. La vérité est que 'data_frame's ne sont pas **' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Hadley a décidé qu'il n'aimait pas le comportement par défaut de 'data.frame's et il a intentionnellement modifié le comportement de' data_frame's. Utilisateur méfiez-vous. – joran
... vous pouvez créer la même erreur avec 'data.frame's en faisant' d.f [1,1, drop = FALSE] ', je pense. – joran