如何在R中对变量执行for循环

hk8txs48  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(121)

我的问题是关于使用for循环重复基于类别变量的数据分析。
使用内置的Iris数据集,我如何在下面的代码上运行一个for循环,这样它就可以首先生成setosa,然后是versicolor,然后是virginica的图表,而不必手动更改/设置物种?

ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_point()

我刚开始还不知道我在做什么

kninwzqo

kninwzqo1#

您需要按照here所述使用print()

library(tidyverse)
data(iris)

species <- iris |> distinct(Species) |> unlist()

for(i in species) {
  p <- iris |> 
    filter(Species == i) |> 
    ggplot() + 
      geom_point(aes(x=Sepal.Length, y=Sepal.Width)) + 
      ggtitle(i)
  print(p)
}
km0tfn4u

km0tfn4u2#

你可以使用一个for循环作为u/DanY posted;然而,使用这种结构很难以通用的方式存储和检索绘图。运行循环代码使得检索任何一个特定的绘图变得很困难-您只能在输出窗口中看到最后一个绘图,并且必须“返回”才能看到其他绘图。我建议使用列表结构,以允许您在后续函数中检索任何一个单独的绘图。为此,您可以使用lapply()而不是for(...) { ... }
下面是一个使用dplyrtidyr的示例:

library(ggplot2)
library(dplyr)
library(tidyr)

unique_species <- unique(iris$Species)

myPlots <- lapply(unique_species, function(x) {
  ggplot(
    data = iris %>% dplyr::filter(Species == x),
    mapping = aes(x=Sepal.Length, y=Sepal.Width)
  ) +
  geom_point() +
  labs(title=paste("Plot of ", x))
})

然后将绘图存储在myPlots中。您可以通过myPlots[1]myPlots[2]myPlots[3]访问每个绘图...或者您可以通过patchwork或其他类似的软件包将它们一起绘图。

cowplot::plot_grid(plotlist = myPlots, nrow=1)

相关问题