2012-04-11 4 views
0

グラフがダウンしています。 問題は複数のデータセット(むしろ1つのLARGEデータセットのサブセット)をグラフ化するための_exact_same_code_を持っていますが、$を正しく代用するためのループコードを取得できないようです。データセットをループして特定の列のみをグラフ化する方法はありますか?

データセット、フォームのDF1、DF2、DF3 ...:

OBSDATE  REGION AVG_RESP P10 P90 
2012-02-01 APAC 1.276  0.78 3.45 
2012-02-01 EMEA 2.341  1.23 5.67 
2012-02-02 APAC 1.343  0.89 3.21 
2012-02-02 EMEA 2.473  1.37 5.98 

グラフは、より複雑ですが、このような:

avgMx <- quantile(df1$P90,0.95) 
ggplot(df1,aes(x=OBSDATE,y=AVG_RESP))+coord_cartesian(ylim=c(0,avgMx))+geom_ribbon(aes(ymin=P10,ymax=P90),fill="gray60",alpha=0.33)+geom_line(aes(x=OBSDATE,y=AVG_RESP),color="#007DB1",size=0.5)+facet_wrap(~REGION) 

私は、ベクトルやリストを定義する場合(両方とも同じエラーメッセージで失敗すると思われます)データセット名を持つループを得ることができません。

私は

for (i in filenames) { 
    quantile(i$AVG_RESP,0.95) 
    max(i$AVG_RESP) 
} 

を動作するように、このような何かを取得したいと思います。しかし、私は$は、原子のベクトルには無効であるというエラーを取得します。調査の結果、利用可能な結果は得られていないようです。

だから、私はこの仕事を得ることができます:

max(df1$AVG_RESP) or max(df1['AVG_RESP']) 

どちらだろう上記の出力2.473。ただし、これは飛ばない:

for (i in pagesC) max(i['AVG_RESP']) 

何もしません。これに変更する:

for (i in pagesC) print(max(i['AVG_RESP'])) 

NAのインスタンスを指定します。

私は完全に固執しています。どんな助けも大いに評価されるでしょう!

EDIT:エラーの原因となったデータを修正しました。再現性があるはずです。

答えて

3

iは文字列です。 iに保持されている名前のオブジェクトが必要です。つまり、get()関数です。 (あなたが与えたもの以来、テストされていないが、再現できなかった。)

for (filename in filenames) { 
    i <- get(filename) 
    quantile(i$AVG_RESP,0.95) 
    max(i$AVG_RESP) 
} 

これはしかし、おそらくあなたの問題を解決する最良の方法ではありません。すべてのデータフレームをリストに入れて、そのリストをlapplyでループする方が良いアプローチかもしれません(タイラーが彼の答えで説明したもの)。さらに、これらがサブセットであり、あなたが持っているより大きな単一のデータフレームを作成した場合、より良いアプローチは、plyrパッケージから何かを使用して、大きなデータフレームを分割する方法とそれぞれをどうするかを定義することです部。

+0

ブライアン、ありがとう!それはまさに私が探していたものですが、私の理解と利用可能な機能の両方の欠点を理解していませんでした。私は新しい実装をRに移行させてSASユーザーを回復させています。このようにして私が望むことができないように見えます - 何らかの理由でggplotがループ内で起動していないためです。私はplyrを掘り起こして、それが仕事を終わらせるかどうかを見ます。 – BenH

+2

@BenH - ggplotオブジェクトを 'print()'していることを確認していますか?関数で使用するとggplotとlatticeオブジェクトの両方を出力する必要があります...私は99%がこれがFAQであると確信しています。おそらく誰かが私たちのために思い出すでしょう。 – Chase

+0

あなたは正しい、チェイス。 FAQのその部分を見落とさなければならない。 – BenH

3

あなたのコードはので、これは私の最高の推測では、あなたが望むものである再現可能ではありません。

df1 <- df2 <- df3 <- read.table(text="OBSDATE  REGION AVG_RESP P10 P90 
2012-02-01 APAC 1.276  0.78 3.45 
2012-02-01 EMEA 2.341  1.23 5.67 
2012-02-02 APAC 1.343  0.89 3.21 
2012-02-02 EMEA 2.473  1.37 5.98 
2012-02-01 APAC 1.276  0.78 3.45 
2012-02-01 EMEA 2.341  1.23 5.67 
2012-02-02 APAC 1.343  0.89 3.21 
2012-02-02 EMEA 2.473  1.37 5.98 
2012-02-01 APAC 1.276  0.78 3.45 
2012-02-01 EMEA 2.341  1.23 5.67 
2012-02-02 APAC 1.343  0.89 3.21 
2012-02-02 EMEA 2.473  1.37 5.98", header=TRUE) 

info <- function(dataframe){ 
    c(quantile(dataframe$AVG_RESP,0.95), max(dataframe$AVG_RESP)) 
} 

LIST <- list(df1, df2, df3) 
lapply(LIST, info) 
#Or you may want to use sapply if you want it to return a matrix 
sapply(LIST, info) 

Rは、ループを使用することができますが、これは本当に物事のRの方法ではありません。

+0

なぜ私はそれが "再現可能"でないのか不思議です。私が変更した唯一の事は、データフレーム名とデータ量が少なくて済みました。他のすべては私のために走るコードです - もちろん、ループはありません。 – BenH

+0

ええとベン私は何が間違っているかを理解した。私はそれが私にエラーを与えているデータが少なすぎると思っていました。データの最後に小さな目盛りがあり、切り取って貼り付けるとエラーが表示されますが、エラーがスローされます。だから私はあなたのデータセットをまとめて貼り付けましたが、これは必要ではありませんでした。 –

+0

PS私はあなたがループを使いたいと思っていますが、私は実際にあなたが適用されている機能ファミリーに慣れ親しんだことを本当にお勧めします。 –

関連する問題