web-dev-qa-db-ja.com

Rのループを使用した複数のプロット

ループを使用してRでプロットしようとしていますが、列x_1の異なる名前に従って、下のデータフレームのz_2に対してz_1列をプロットします(データを視覚化する任意のプロットが行います)。

x_1 <- c("A1", "A1","A1", "B10", "B10", "B10","B10", "C100", "C100", "C100")


z_1 <- rnorm(10, 70) 

z_2 <- rnorm(10, 1.7)

A <- data.frame(x_1, z_1, z_2)

そのため、最終的に3つの異なるプロットになります。 1つはカテゴリA1用、もう1つはB10用、もう1つはC100用です。 3つの異なるコードを使用してこれを行うことができますが、ループまたは他の単一のコードを使用して、同じページで3つのプロットすべてを実行できるようにしたいと思います。実際には、大規模なデータセット(4,000行)があり、ページに2つのID(たとえば、ページに5つ)をプロットしたいと考えています。

これが理にかなっていることを願っています。ご協力いただきありがとうございます。

これらを個別にプロットしようとしています。

a1の場合:

data_A1 <- A[which(A$x_1 == "A1"), ]
plot(data_A1$z_2, data_A1$z_1)

私もこのようなことを試みましたが、エラーメッセージが表示されました

for ( i in A$x_1[[i]]){

plot(A[which(A$x_1==A$x_1[[i]]), ], aspect = 1)
}
16
John_dydx

ループを使用した簡単なアプローチは

_for (cat in unique(x_1)){
  d <- subset(A, x_1 == cat)
  plot(d$z_1, d$z_2)
}
_

unique(x_1)は、_x_1_の一意の値をすべて取得します。次に、これらの値のそれぞれについて、対応するサブセットを取得し、このサブセットをプロットに使用します。

16
Mark Heckmann

元のコードが機能しなかった理由を理解するために:

データのセットアップは正常に動作します

_x_1 <- c("A1", "A1", "A1", "B10", "B10", "B10","B10", "C100", "C100", "C100")
z_1 <- rnorm(10, 70) 
z_2 <- rnorm(10, 1.7)
A <- data.frame(x_1, z_1, z_2)
_

個々のプロットは正常に機能しますが、コメントで述べたように、whichは不要です

_data_A1 <- A[which(A$x_1 == "A1"), ] # your way
plot(data_A1$z_2, data_A1$z_1)

data_A1 <- A[A$x_1 == "A1", ]    # deleting which() makes it cleaner
with(data_A1, plot(z_2, z_1))    # you can also use with() to save typing
_

これでforループ。 Rの単純なforループを見てみましょう(_?"for"_の例にかなり近い):

_for (i in 1:5) {
   print(1:i)
}
_

_1:5_はc(1, 2, 3, 4, 5)なので、最初はiが_1_、次に_2_などです。forループには最初に問題がありますライン:

_for (i in A$x_1[[i]]) { ## already a problem
_

最初のiは_A$x_1[[i]]_ですか?それは機能しません、iはまだ定義されていません。また、_A$x_1_はリストではなくベクトルなので、_[[_を使用してサブセット化しないでください。ただし、サブセットはまだ必要ありません。iが取るべき値のベクトルが必要です。この場合に必要なのはfor (i in c("A1", "B10", "C100"))ですが、さまざまな可能性をすべて入力するのではなく、プログラムで実行することも必要です。それを取得する一般的な方法がいくつかあります。

_unique(A$x_1) # as in Mark's solution
levels(A$x_1) # works because A$x_1 is a factor
_

これらの式のいずれかをinの後に置くことができます。プロット呼び出しで_[[_を_[_に変更しました。 _[[_はリスト専用です。不要なwhich()も削除しました

_for (i in unique(A$x_1)) {   # this line is good
    plot(A[A$x_1==A$x_1[i], ], aspect = 1)  # still a problem
}
_

iが取っている値を思い出してみましょう:_"A1"_、_"B10"_、_"C100"_。 _A$x_1 == A$x_1["A1"]_は何を提供しますか?有用なものはありません。

_for (i in unique(A$x_1)) {  
    plot(A[A$x_1 == i, ], aspect = 1)  # getting there
}
_

上記のコードは何かをプロットし、それはきれいですが、それはあなたが望むものではありません。たくさんの警告があり、それらはすべてaspectが有効な引数ではないことを教えてくれるので、削除します。プロットを見ると、3つの変数がプロットされていることがわかります。x軸とy軸に何を配置するかを指定していないためです。

_for (i in unique(A$x_1)) {   
    plot(A[A$x_1==i, "z_2"], A[A$x_1==i, "z_1"])  # z_2 on x, z_1 on y 
}   # Works!!!
_

これはマークの答えとほぼ同じであることに注意してください。 forループでijを使用する必要はありません。彼はcatを使用しました。よりわかりやすい名前を使用することをお勧めします。それでは少し空想しましょう。

_for (i in unique(A$x_1)) {   
    plot(A[A$x_1==i, "z_2"], A[A$x_1==i, "z_1"],
         xlim = range(A$z_2), ylim = range(A$z_1), # base the axes on full data range
         main = paste("Plot of", i))  # Give each a title
}
_

次回:コードの小さな断片を実行してそれらが何であるかを確認できることを忘れないでください。 for (i in A$x_1[[i]])のような行が正しいかどうかわからない場合は、コンソールで_A$x_1[[i]]_と入力してください。うまくいけば、iので、次のように変更します

_for (i in A$x_1)
_

その後、_A$x_1_を実行し、長さが10であることを認識します。10ではなく3つのグラフが必要です。したがって、3つの値を取るためにiが必要です。

14
Gregor

また、データを微調整します。たとえば、ここで行ったように...

日付ごとのプロットとxlab、ylab、およびプロットのタイトルに特定の詳細が必要な場合...

 for ( i in 1:length(unique(wheeldata$Date)) ){
     d <- subset( wheeldata, Date == unique ( wheeldata$Date )[i] )
     plot(d$X, d$Y, xlab = "X", ylab = "Y", main = paste0("Date: ",  unique(d$Date)) )
 }
1
Manoj Kumar