R plot - 带有嵌套for循环

时间:2017-11-01 13:06:23

标签: r for-loop plot nested-loops

我是R的新手,试图有条理地在折线图中绘制垂直条。我正在使用基础R图形。
我从中获取数据的数据帧称为RW1,我在同一图中的两个y轴上绘制了RW1的两个变量。共有2718条意见 现在,我想添加垂直排列的灰色阴影条,这取决于" RW1 $ Measured_CH1_CTT"的标准偏差。该变量绘制在左侧y轴(侧面2)上。也就是说,只要连续八次观测中的标准偏差等于或小于0.5,就应该为这些观测值绘制一个垂直条。
我试图用for循环和嵌入if语句写这个但是有点挣扎。这是我到目前为止所得到的。

# Set values outside loop
xi <- 0
xj <- 0
n <- nrow(RW1)

# Run the loop
for (i in 1:n) {
  for (j in min(i+8, n-i))
    Measured_CH1_CTT = RW1$Measured_CH1_CTT[i:(i+j)]

  if (sd(Measured_CH1_CTT <= 0.5)) {
      xi <- i
      xj <- j
      rect(xleft = xi, xright = xj, ybottom = -0.6, ytop = 0.6, density = 100, col = "grey")
    }
}

关键点是

  • 每个区间(j)的终点的定义; j应该是每个起点i的8个观测值但是我必须防止8个观测值长的间隔&#34;结束时的提示&#34;我的这在n = 2718-7 = 2711
  • 时变得令人感兴趣
  • xleft和xright的定义,分别是每个区间的起点和终点,它满足标准偏差的条件,测量_CH1_CTT&#34;等于或小于0.5
  • if语句。 R给出了错误&#34;参数不能解释为逻辑&#34;
  • ytop和ybottom:由于我有两个,所以指定哪个y轴?我只是猜测左边的那个(第2侧)并指出了那个轴的范围

欢呼任何建议!

编辑:由于变量中缺少值,我在parantheses中指定了na.rm参数,并将&#39;低于等于&#39;正确表达:if (sd(Measured_CH1_CTT, na.rm = TRUE) <= 0.5)。这就产生了if语句missing value where TRUE/FALSE needed的另一个错误 问题的关键在于区间的定义和/或xixj的分配。我独立地执行了if()函数(使用另一个简单的表达式)并且它可以工作。同样,rect()功能在我手动指定xleftxright时有效。

1 个答案:

答案 0 :(得分:0)

好的,它花了我一段时间,但我想出了一些帮助。一般问题是使用ij定义区间。不需要嵌套循环。我已经假设正确指定了rect()函数。我必须在!is.na(sd_temp)语句中添加if()

正确的语法如下所示(名称调整为更一般的理解):

# Add vertical shaded bars
n <- nrow(df) - 7
for (i in 1:n) {
  j = i + 7 
  y_temp = df$y[i:j]

  sd_temp <- sd(y_temp, na.rm = TRUE)
  if (!is.na(sd_temp) & sd_temp <= 0.5) {
    rect(xleft = i, xright = j, ybottom = min.length_y, ytop = max.length_y, density = NA, col = "gray94")
  } else {
    next
  }
}

也许这对其他人有帮助。

警告:在R中,循环一般都有点慢。虽然这个特定的循环只有2700次迭代,但处理速度非常快(!),我不得不在20分钟后中止它。我认为当一个循环与这种情况下的绘图函数结合时,R会更加挣扎。