2017-10-10 2 views
0

私は非常に似た2つのデータフレームを持っていますが、ggplot2は異なって見えます。内容は同じですが、データ構造は微妙に異なります。 1つはdata.frame、もう1つはdata_frameです。 ggplot2の違いを理解したいと思います。以下の例では、両方ともstat_functionで使用されています。 data.frameはプロットを生成し、data_frameはエラーを生成します。これは、Hadleyverseのパッケージの相互運用性を考慮すると特に混乱します。 Dplyr(dplyrはdata.framesをdata_framesに変換する)によって生成されたデータフレームからプロットを作成することができなかったことを発見したときに、この問題に直面しましたが、データフレームは同じであると思いました。 data.frame)はうまくいきました。なぜggplot2はdata.frameとdata_frameを別々に見るのですか?

例1

まず、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])) 

plot from data.frame

そして今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 

enter image description here

例2

おそらく根本的な問題は同じであるが、この例では、異なるエラーメッセージを生成します。まず、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)) 

plot produced from data.frame

そしてここ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 
+3

'pull(d_f [1,2])'を試してください。それはサブセット化した後でもまだまだです。しかし、ggplotは 'pull'を修正するベクトルを期待しています。見てください[ここ](https://stackoverflow.com/questions/21618423/extract-a-dplyr-tbl-column-as-a-vector) – Jimbou

+3

ggplotではありません。真実は、 'data_frame'はいくつかの重要な点で**' ** data.frame'ではなく、あなたはそれらの1つを発見しました。ハドレーは、 'data.frame'のデフォルト動作のいくつかを気に入らず、意図的に' data_frame'の動作が異なっていると判断しました。ユーザーは注意してください。 – joran

+2

... 'd.f [1,1、drop = FALSE]'を実行して 'data.frame'sで同じエラーを生成することができます。 – joran

答えて

1

ggplotは、値が期待されるデータフレームを見ていました。

これは、data.frameまたはtibble(ハドレーのdplyrが推奨するデータフレーム)に適用された場合に適用されるサブセッティングの角括弧演算子によって返されるデータタイプの違いに起因します。 data.frameをサブセット化すると、デフォルトでタイプが変更されます。ベクトルまたは値を返します。 tibbleをサブセット化すると、ユーザが明示的に再キャストを要求しない限り、tibbleが返されます。 pullまたは二重括弧[[]]を使用してください。エラーメッセージ "数学的関数への非数値的引数"は手がかりになっているはずです。

次のコードは、tibbleを適切に再キャストすることでこれを実証しています。 ライブラリ(ggplot2) ライブラリ(dplyr)

d.f <- data.frame(mean = 0, sd = 1) 
d_f <- data_frame(mean = 0, sd = 1) 

tibble(別名tbl_dftbl_dfを返しサブセット化。二重の角括弧[[]]またはpullで再鋳造することができる

class(d_f[1,1]) 
## [1] "tbl_df"  "tbl"  "data.frame" 

class(d_f[[1,1]]) 
## [1] "numeric" 
class(pull(d_f[1,1])) 
## [1] "numeric" 

サブセット化data.frameは数値ベクトルを返します。

class(d.f[1,1]) 
## [1] "numeric" 

tibbleをサブセット化の挙動、すなわち無再鋳造、引数drop=FALSEで製造することができます。

class(d.f[1,1, drop=FALSE]) 
## [1] "data.frame" 

最後に、タイプの問題を解決すると、プロットの問題が解決されることを示す...

ggplot(data.frame(x=-3:3), aes(x)) + 
    stat_function(fun = function (x) dnorm(x, mean = pull(d_f[1,1]), sd = pull(d_f[1,2]))) 

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]])) 

の両方が期待されるプロットを生成します。 plot created when types are correct

関連する問題