【问题标题】:Creating multiple plots with a loop in R在 R 中使用循环创建多个图
【发布时间】:2019-07-01 00:06:24
【问题描述】:

我的数据可用here,如下所示:

sq_id        total_forays_day age_at_loc date.x  
  <chr>            <dbl>      <dbl>      <chr>   
22897                1         41        17-06-18
22897                1         42        17-06-19
22897                2         43        17-06-20
22897                2         43        17-06-20
22897                1         44        17-06-21
22897                1         45        17-06-22

我想使用循环为 89 个唯一的 sq_id 创建一个 plot(total_forays_day~age_at_loc)

我可以通过运行以下命令获得 sq_id 的独特图:

plot(total_forays_day~age_at_loc, data=(data%>%filter(sq_id=="22641")), type="l")

但这不是一种有效的方法,因为我需要可视化 89 个图。

我试过了:

par(mfrow=c(10,10))
for(i in 1:1) { #loop over loop.vector
    plot(total_forays_day~age_at_loc[,i], data=data)
}

这不起作用。我收到以下错误消息:

age_at_loc[, i] 错误:维数不正确

我应该如何修复我的for 循环代码?任何建议,将不胜感激!

【问题讨论】:

  • 你打算用这89个地块做什么?您可以使用pdf("quux.pdf")/plot(...)/dev.off() 或(甚至更好)rmarkdown 文档将它们全部呈现为 pdf。
  • @r2evans 我只需要可视化图表,看看我的数据随着时间的推移是否有任何奇怪的趋势
  • 那么for 循环有什么问题?您可以使用readline("next plot ...")(按回车键继续)或locator(1)(单击图像)暂停循环中的每个图像。我不知道如何执行“”,有时会很方便。
  • @r2evans 我同意; for 循环正是我应该做的。问题是,我编写循环的方式给了我一条错误消息。 Error in age_at_loc[, i] : incorrect number of dimensions
  • 如果age_at_loc 是一列,则不能在其索引中使用逗号(它只是一个向量)。试试total_forays_day~age_at_loc[i]

标签: r loops plot subset


【解决方案1】:

先试试这个:

# remove [1:3] when you are comfortable with this and want to see all of them
for (d in split(data, data$sq_id)[1:3]) {
  plot(total_forays_day ~ age_at_loc, data=d)
  readline("next") # or locator(1)
}

您遇到的问题:

  • total_forays_day~age_at_loc[,i]age_at_loc 视为一个框架,但它是一个向量
  • total_forays_day~age_at_loc[i](正如我错误地建议的那样)正在将向量与单个数字进行比较,这不起作用,因为 plot 期望所有向量的长度相同(age_at_loc[i] 的长度为 1)

您的问题是您没有以有效的方式拆分数据。如果您查看来自split(...) 的结果,您会看到类似

str(split(data, data$sq_id)[1:3])
# List of 3
#  $ 22640:'data.frame':    102 obs. of  4 variables:
#   ..$ sq_id           : int [1:102] 22640 22640 22640 22640 22640 22640 22640 22640 22640 22640 ...
#   ..$ total_forays_day: int [1:102] 1 1 1 1 1 1 1 1 1 1 ...
#   ..$ age_at_loc      : int [1:102] 49 49 51 51 52 52 53 53 54 54 ...
#   ..$ date.x          : Factor w/ 124 levels "17-06-07","17-06-08",..: 2 2 3 3 4 4 5 5 6 6 ...
#  $ 22641:'data.frame':    52 obs. of  4 variables:
#   ..$ sq_id           : int [1:52] 22641 22641 22641 22641 22641 22641 22641 22641 22641 22641 ...
#   ..$ total_forays_day: int [1:52] 1 1 1 1 1 1 1 1 2 2 ...
#   ..$ age_at_loc      : int [1:52] 49 51 52 53 54 55 59 60 61 61 ...
#   ..$ date.x          : Factor w/ 124 levels "17-06-07","17-06-08",..: 2 3 4 5 6 7 8 9 10 10 ...
#  $ 22653:'data.frame':    35 obs. of  4 variables:
#   ..$ sq_id           : int [1:35] 22653 22653 22653 22653 22653 22653 22653 22653 22653 22653 ...
#   ..$ total_forays_day: int [1:35] 2 2 2 2 1 2 2 1 2 2 ...
#   ..$ age_at_loc      : int [1:35] 58 58 59 59 60 61 61 62 63 63 ...
#   ..$ date.x          : Factor w/ 124 levels "17-06-07","17-06-08",..: 10 10 11 11 12 13 13 14 15 15 ...

请注意列表中的每个元素在其框架中如何具有相同的sq_id。所以split(...)[[1]]是一个有102行的框架,它们都是sq_id"22640"。通过使用for (d in split(data, data$id)) 对其进行迭代,循环中的每个通道都为d 分配了这些单sq_id 帧之一。

readlines("next")locator(1) 的使用纯属主观和用户体验。如果您更喜欢按回车,请选择第一个;如果您更喜欢点击图片,请选择第二个。

要知道,如果你正在对拆分数据做其他事情,那么拆分一次并使用多次可能会有好处,ala

splitdata <- split(data, data$sq_id)
for (d in splitdata) { ... }

【讨论】:

  • 感谢您为我打破了这一点。这种解释确实有助于澄清我的代码在做什么(和没有做什么)。
猜你喜欢
  • 2021-01-10
  • 2022-01-22
  • 2016-04-22
  • 2022-06-14
  • 2021-03-25
  • 1970-01-01
  • 2015-09-16
  • 2020-05-25
  • 2021-10-20
相关资源
最近更新 更多