在R中使用循环的多个图

Joh*_*ydx 16 plot loops r dataframe

我仍然试图利用循环在R中绘图.我想根据列x_1中的不同名称绘制(任何可以将数据可视化的绘图)列z_1对应于下面数据框中的z_2.

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)
Run Code Online (Sandbox Code Playgroud)

因此,我想最终得到三个不同的情节; 一个用于A1类,一个用于B10,另一个用于C100.我可以使用三个不同的代码执行此操作,但我希望能够使用循环或任何其他单个代码在同一页面上执行所有三个绘图.实际上,我有一个大型数据集(4,000行),并希望在页面上绘制几个ID(比如页面上的5个).

我希望这是有道理的.谢谢你的帮助.

这是我尝试单独绘制它们:

对于A1:

data_A1 <- A[which(A$x_1 == "A1"), ]
plot(data_A1$z_2, data_A1$z_1)
Run Code Online (Sandbox Code Playgroud)

我也试过这样的东西,但收到错误信息

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

plot(A[which(A$x_1==A$x_1[[i]]), ], aspect = 1)
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 16

循环的简单方法是

for (cat in unique(x_1)){
  d <- subset(A, x_1 == cat)
  plot(d$z_1, d$z_2)
}
Run Code Online (Sandbox Code Playgroud)

unique(x_1)获得你所有独特的价值x_1.然后,对于这些值中的每一个,获得相应的子集并使用该子集进行绘图.

  • 例如`layout(matrix(1:3,ncol = 3))`,然后是上面的代码. (2认同)

Gre*_*gor 14

只是为了理解原始代码不起作用的原因:

设置数据工作正常

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)
Run Code Online (Sandbox Code Playgroud)

个人情节工作正常,但正如我在评论中所说,这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
Run Code Online (Sandbox Code Playgroud)

现在是for循环.让我们回顾一下R中的一个简单的for循环(非常接近于示例?"for"):

for (i in 1:5) {
   print(1:i)
}
Run Code Online (Sandbox Code Playgroud)

非常简单,1:5c(1, 2, 3, 4, 5),所以首先i1,2等等.你的for循环在第一行有一个问题:

for (i in A$x_1[[i]]) { ## already a problem
Run Code Online (Sandbox Code Playgroud)

首先iA$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
Run Code Online (Sandbox Code Playgroud)

我们可以把这些表达式中的任何一个放在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
}
Run Code Online (Sandbox Code Playgroud)

让我们提醒自己什么样的价值观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
}
Run Code Online (Sandbox Code Playgroud)

上面的代码描绘了一些东西,它很整洁,但它不是你想要的.有一堆警告,他们都告诉我们这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!!!
Run Code Online (Sandbox Code Playgroud)

请注意,这几乎与Mark的答案完全相同.他没有使用ijfor for循环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
}
Run Code Online (Sandbox Code Playgroud)

下一次:不要忘记你可以运行一小段代码来查看它们是什么.如果你有一条这样的线for (i in A$x_1[[i]]),你不确定它是否正确,请进入A$x_1[[i]]控制台,希望这可以帮助你弄清楚你没有定义i,所以你要把它改成

for (i in A$x_1)
Run Code Online (Sandbox Code Playgroud)

然后你运行A$x_1并意识到它的长度是10.你想要3个图形,而不是10个,所以你需要i取3个值,所有这些都是不同的,等等.

  • 太棒了!这可能是我从这个论坛收到的最佳答案.现在我理解循环好多了.谢谢shujaa. (2认同)