ループを使用して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)
}
ループを使用した簡単なアプローチは
_for (cat in unique(x_1)){
d <- subset(A, x_1 == cat)
plot(d$z_1, d$z_2)
}
_
unique(x_1)
は、_x_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)
_
個々のプロットは正常に機能しますが、コメントで述べたように、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ループでi
とj
を使用する必要はありません。彼は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
が必要です。
また、データを微調整します。たとえば、ここで行ったように...
日付ごとのプロットと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)) )
}