【问题标题】:R: find all indeces of local minima below 0R:查找所有低于 0 的局部最小值的索引
【发布时间】:2014-11-16 20:38:28
【问题描述】:

这可能不是很复杂,但我对 if 语句感到困惑。我有一个大型数据集,我正在寻找低于 0 的两个值对的最小化索引。下面是一个示例:

x <- c(-1, 2, 3, -1, -2, 1, 2, -1)

我试图找到低于 0 的值的索引,如果两个(或更多)后续值低于 0,则为最低值的索引。所以我想得到一个像这样的向量

[1] 1 5 8

我试图通过查看导数来解决这个问题:

which(diff(sign(diff(test)))==2)+1

但这并没有给我我需要的东西,因此我尝试使用 for 循环和 if 语句尝试此操作失败

非常感谢任何帮助。

【问题讨论】:

    标签: r if-statement indexing


    【解决方案1】:
    x <- c(-1, 2, 3, -1, -2, 1, 2, -1)
    y = diff(x)
    which((c(0,y)*c(-y,0)>=0) & ((c(0,y) + c(-y, 0))<0))
    
    # [1] 1 5 8
    

    描述我的答案:which((c(0,y)*c(-y,0)&gt;=0)) 正在查找本地最小值和最大值。然后将其与第二学期结合起来,只需选择本地min

    如果您对低于零的值感兴趣,可以添加其他条件

    which((c(0,y)*c(-y,0)>=0) & ((c(0,y) + c(-y, 0))<0) &(x<0))
    

    如果要选择本地max,可以改成

    which((c(0,y)*c(-y,0)>=0) & ((c(0,y) + c(-y, 0))>0))
    # [1] 3 7
    

    【讨论】:

      【解决方案2】:

      tapply 的一种方法:

      idx <- which(x < 0)
      unname(tapply(idx, c(0L, cumsum(diff(idx) > 1L)), function(i) i[which.min(x[i])]))
      # 1 5 8 
      

      【讨论】:

        【解决方案3】:

        一种使用rle的方法

        localmin <- function(x) {rlex <- rle(x<0)
                            rlex$values <- seq_along(rlex$values) *rlex$values
                            ix <- inverse.rle(rlex)
                            ixt <- tapply(seq_along(ix)[ix>0], ix[ix>0], function(i,xi) i[which.min(xi[i])],xi=x)
                            unname(ixt)
                            }
        
        
        localmin(x)
        # [1] 1 5 8
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-04
          • 2020-07-22
          • 2013-06-12
          • 1970-01-01
          相关资源
          最近更新 更多