2017-01-16 27 views
0

添付されたリストがあります。ggplot rエラー連続したスケールに供給される離散値

Site Name 5833    count ratio 
1 Boston  0 days per week 1  0.01428571 
2 Boston  1 day per week 6  0.08571429 
3 Boston  2 days per week 11  0.15714286 
4 Boston  3 days per week 5  0.07142857 
5 Seattle 0 days per week 2  0.02857143 
6 Seattle  1 day per week 6  0.08571429 
7 Seattle  2 days per week 10  0.14285714 
8 Seattle  3 days per week 8  0.11428571 

私はggplotを使用する場合 - これは、後輪のために入れられますので、「5833」 - 私は名前<を使用する必要があります。

name <- "5833" 
ggplot(com_agg,aes(x=com_agg[,c(name)], y=ratio,fill=`Site Name`))+ 
geom_bar(stat = "identity", position = "dodge") 

私はエラーを取得する:

"Don't know how to automatically pick scale for object of type tbl_df/tbl/data.frame. 
Defaulting to continuous. Error: Discrete value supplied to continuous scale" 

私は、このデータフレームの列名の選択に気づいたが、Rに自動的にバッククォートのペアに含まれる必要があり、それは、スペースまたは特殊の原因である可能性があり列の名前。だから、単にggplotでcolumnの名前を使うことはできません。

+1

do 'class(com_agg [、c(name)])'。数字列ではないことがわかります。これはggplotが警告するものです。 –

+1

また、 'aes()'の中に*列名*ではなく*ベクトル*を渡すと、より複雑なプロットで問題が発生します。 'y = ratio'は良いです。 'x = com_agg [、c(name)]'でデータフレームを再参照するのは悪いです。あなたのカラムの名前を変更して、標準のカラム名のガイドライン(数字で始まらない)に従い、 'x = x5833'を使うのがベストでしょう。 – Gregor

答えて

0

変数のclassを正式に確認しなくても、添付されたデータからクラスを見ずに文字列または因子を渡していることは明らかです。あなた簡単に変数が実行することによって、数値に変換できます。

com_agg$`5833` <- as.numeric(substr(com_agg$`5833`, 1, 1)) 

あなたの変数はあなたが便利なこのマイナーを処理できるようになるtaRfix::destingまたは類似の機能を見て検討することができる提供された例ではより複雑であることの場合チャレンジ。

この問題に対処するには、dplyr/ggplotパイプラインを使用する必要があります。ここでは、別のオブジェクトを作成したり、既存のオブジェクトのsatateを変更したりすることなく簡単に変換を適用できます。例えば:

com_agg %>% 
    mutate(`5833` = as.numeric(substr(`5833`, 1, 1))) %>% 
    ggplot(aes(x = `5833`, y=ratio, fill =`Site Name`)) + 
     geom_bar(stat = "identity", position = "dodge") 

のように使用しているデータフレームは、check.names = FALSEで作成されたようです:

data.frame("1" = 1, check.names = FALSE) 

何かを行う前に、私はあなたが構文上正しい使用を検討していることを示唆していますしたがって、上記の構文では``です。構文上正しい名前を作成するには、

make.names(names(dta)) 

を入力します。必要であれば、あなたはggplot/dplyrパイプラインに次の構文を導入する可能性:

setNames(make.names(names(.)), object = .) 

これは文法的に間違った名前を修正します。たとえば5833X5833になります。私はあなたのループを少し書くのが面倒かもしれないと思っていますが、原則として、``を使用して余裕ができ、将来の事態が起こり、列名として定数を使用しようとします。

+0

ggplotではx = com_agg [、c(name)]を使用する必要があります。これはforループにあり、nameは各繰り返しで渡される変数です。私はX5833に名前を変えても、私はまだループ内でx = com_agg [、c(name)]を使わなければなりません。私はこれが私を助けてくれるとは思わない。 – JamesWang

+0

@JamesWang名前のことは、サイドコメントでした。 get/pasteの組み合わせを使ってXで名前をつけることができます。重要なのは、変数の時間が間違っていて、最初に示唆したように数値に変換する必要があるということです。 – Konrad

+0

@JamesWangこれは 'ggplot'で動的列名を使用するにはまだ間違っています。より良い方法は、 'aes_'、' aes_q'、または 'aes_string'を使用することです(例のドキュメンテーションを参照してください)。あなたが持っている方法は単純なプロットでは機能しますが、ファセットやビニングされたデータを含むプロットなど、より複雑なプロットではこれまでどおり動作しません。 – Gregor

0

すべての回答ありがとうございます。

選択の煩わしさを避けるために、変数名を標準に準拠するように変更しました。第2に、forループ内でggplotにaes_stringを使用しました。これはforループ内でggplotを使用する有効な方法です。今それは働いている!

関連する問題