新增内容:在R中使用For&If语句标识本地千里马

时间:2018-10-03 13:29:15

标签: r

由于对我的上一个问题有所帮助,我进行了一些修改,并使代码正常工作。但是,当我增加r的长度时,最大值未正确存储。谁能找出原因?

对不起,我是菜鸟。

代码:

r <- c(1, 2, 3, 4, 5, 4, 3, 4, 5, 6, 7, 5, 2, 4, 8, 11, 12, 9)
Peaks <- c()
indPeaks <- c()
n <- length(r)-1
for (x in 1:n) {
  if ((x-1)<1){
    if(r[x+1]<r[x]) {
      Peaks <-r[x]
      indPeaks <- which(r == r[x])
    }
  }
  else{
    if(r[x-1]<r[x]&r[x+1]<r[x]) {
      Peaks <-r[x]
      indPeaks <- which(r == r[x])
    }
  }
}

退货(环境):

indPeaks 
17      # should be: 5 11 17

Peaks 
12 #should be: 5 7 12

该代码适用于

r <- c(1, 2, 3, 4, 5, 4, 3, 4, 5, 6, 7)

1 个答案:

答案 0 :(得分:0)

您好,欢迎来到StackOverflow。

您之前的代码起作用的原因是因为它仅包含1个峰值。

如果您为此目的使用for循环,则需要将先前的值和当前的值进行组合。因此,在您的情况下,将值分配给PeaksindPeaks时。因此代码将是:

r <- c(1, 2, 3, 4, 5, 4, 3, 4, 5, 6, 7, 5, 2, 4, 8, 11, 12, 9)
Peaks <- c()
indPeaks <- c()
n <- length(r)-1


for (x in 1:n) {
  if ((x-1)<1){
    if(r[x+1]<r[x]) {
      Peaks <-c(Peaks,r[x])
      indPeaks <- c(indPeaks,x)
    }
  }
  else{
    if(r[x-1]<r[x]&r[x+1]<r[x]) {
      Peaks <- c(Peaks,r[x])
      indPeaks <- c(indPeaks, x)
    }
  }
}

输出:

 > Peaks
[1]  5  7 12
> indPeaks
[1]  5 11 17

请注意,我更改了indPeaks <- c(indPeaks, x)的最后一部分。先前版本不正确的地方,因为您在r中有多个与r[x]相同的值。注意:我并未尝试优化您的代码,我已进行了修复,以使您获得预期的输出。 :)