当 R 中的斜率发生变化时,在向量中查找数据点

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

提问人:confusedindividual 提问时间:4/4/2022 最后编辑:thelatemailconfusedindividual 更新时间:4/4/2022 访问量:302

问:

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

示例向量

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
R 符号

评论


答:

2赞 David L. 4/4/2022 #1

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

例如:

> 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
> 
0赞 Maurits Evers 4/4/2022 #2

我不太清楚您如何定义“最小”位置。但以下内容将返回与预期输出匹配的位置向量。

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

或者,如果你想返回一个 ,也许是这样的东西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
0赞 Maël 4/4/2022 #3

以 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