当R中的斜率变化时在向量中找到数据点

Finding the data point in vector when the slope changes in R

如果我有一个显示斜率变化的向量(由符号函数生成),当斜率从 1 变为 -1 时,我如何找到数据 point/points。

示例矢量

1 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1 1

或者有没有办法以某种方式让输出告诉我当负斜率的线段后跟正斜率 (/) 的线段时所定义的向量中有多少个最小值。在上面的示例中,将有两个最小值,因此示例输出为:

minima 
2

在一个完美的世界里,我希望有这样的输出

Minima Location
1        8
1        9
2        16
2        17

所有这些类型的问题都有一个很好的技巧。您获取向量的副本并将其向左移动一个,然后使用向量化比较,并且在移动向量不等于原始向量的任何地方出现最小值。

例如:

> a = c(1,1,-1,-1,1,-1)
> n = length(a)
> b = a[-1]  # Drop the first element
> d = a[-n]  # Drop the last element
> b
[1]  1 -1 -1  1 -1
> d
[1]  1  1 -1 -1  1
> minima = which(b!=d)
> minima
[1] 2 4 5
> 

我不太清楚你是如何定义“最小”位置的。但以下 return 是一个位置矢量,与您的预期输出相匹配。

x <- c(1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1)
which(c(0, diff(x)) > 0 | c(diff(x), 0) > 0)
[1]  8  9 16 17

或者如果你想 return 一个 data.frame,也许是这样的

library(dplyr)
x %>%
    enframe(name = "Location") %>%
    mutate(is_minimum = c(0, diff(value)) > 0 | c(diff(value), 0) > 0) %>%
    filter(is_minimum) %>%
    mutate(Minima = cumsum(c(0, diff(Location)) != 1)) %>%
    select(-c(value, is_minimum))
## A tibble: 4 x 2
#  Location Minima
#     <int>  <int>
#1        8      1
#2        9      1
#3       16      2
#4       17      2

R 基的另一种方式:

w = which(diff(a) > 0)
# [1]  8 16

length(w) #minima
# [1] 2

data.frame(Minima = rep(seq(w), each = 2),
           Location = c(rbind(w, w+1)))
#  Minima Location
#1      1        8
#2      1        9
#3      2       16
#4      2       17