只是为了理解为什么你的原始代码没有起作用:
设置数据没问题
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"), ]
plot(data_A1$z_2, data_A1$z_1)
data_A1 <- A[A$x_1 == "A1", ]
with(data_A1, plot(z_2, z_1))
现在讲解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
是一个向量,而不是一个列表,所以你不应该使用 [[
来对其进行子集筛选。但我们现在并不需要子集,我们想要的是应该取哪些值的向量。在这种情况下,我们需要的是 for (i in c("A1", "B10", "C100"))
,但我们还希望通过编程的方式来实现它,而不是手动打出所有可能性。有几种常见的方法可以做到这一点:
unique(A$x_1)
levels(A$x_1)
我们可以在
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)
}
以上代码绘制了一些内容,看起来很整洁,但不是你想要的。有一堆警告,都告诉我们 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!!!
注意,这几乎与 Mark 的答案完全相同。您不必在 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),
main = paste("Plot of", i))
}
下次:不要忘记,您可以运行一些小代码片段来查看它们的内容。如果您有一行代码像 for (i in A$x_1[[i]])
,您不确定它是否正确,请在控制台输入A$x_1[[i]]
,希望这将帮助您发现您未定义i
,因此您需要将其更改为
for (i in A$x_1)
然后你运行A$x_1
并意识到它的长度是10。你想要3个图表,而不是10个,因此你需要i
取3个不同的值等。
x <- runif(10)
,然后比较x[x < 0.5]
和x[which(x < 0.5)]
。就像你上面的代码一样,你可以省略“which”来得到相同的结果。 - Gregor Thomas