R 在数据帧中寻找最小转折点

R 在数据帧中寻找最小转折点,r,R,我有一个数据帧df1。我想找出每列的最小转折点,其中最小点前后的值大于它。例如,在x=c(2,5,3,6,1,1,1)中,我想确定最小转折点在3,但使用min函数,我只能找到最小点,即1。如果没有最低点,我想得到NA。谢谢 > df structure(list(x = c(2, 5, 3, 6, 1, 1, 1), y = c(6, 9, 3, 6, 3, 1, 1), z = c(9, 3, 5, 1, 4, 6, 2)), row.names = c(NA, -7L), class

我有一个数据帧df1。我想找出每列的最小转折点,其中最小点前后的值大于它。例如,在x=c(2,5,3,6,1,1,1)中,我想确定最小转折点在3,但使用min函数,我只能找到最小点,即1。如果没有最低点,我想得到NA。谢谢

> df
structure(list(x = c(2, 5, 3, 6, 1, 1, 1), y = c(6, 9, 3, 6, 
3, 1, 1), z = c(9, 3, 5, 1, 4, 6, 2)), row.names = c(NA, -7L), class = c("tbl_df", 
"tbl", "data.frame"))


df1>
  x     y     z
  2     6     9
  5     9     3
  3     3     5
  6     6     1
  1     3     4
  1     1     6
  1     1     2
预期结果如下所示

df2>
 x      y      z
 3      3      1

您可以使用
lead
lag
将当前值与上一个值和下一个值进行比较

library(dplyr)

df %>% summarise(across(.fns = ~min(.x[which(lag(.x) > .x & lead(.x) > .x)])))

#     x     y     z
#  <dbl> <dbl> <dbl>
#1     3     3     1
库(dplyr)
df%>%总结(跨越(.fns=~min(.x[其中(滞后(.x)>.x和领先(.x)>.x)])
#x y z
#    
#1     3     3     1
备用方法

df %>% summarise_all(~ifelse(min(.)==last(.) | min(.) == first(.), min(.[. != last(.) & . != first(.)]), min(.)))

  x y z
1 3 3 1
用于返回行\u nums

df %>% mutate_all(~ifelse(min(.)==last(.) | min(.) == first(.), min(.[. != last(.) & . != first(.)]), min(.))) %>%
  mutate(id = row_number()) %>% left_join(df %>% mutate(id = row_number()), by = "id") %>%
  mutate(x_r = ifelse(x.x == x.y, row_number(), 0),
         y_r = ifelse(y.x == y.y, row_number(), 0),
         z_r = ifelse(z.x == z.y, row_number(), 0)) %>%
  select(ends_with("r")) %>% summarise_all(~min(.[. != 0]))

  x_r y_r z_r
1   3   3   4
```

您可以使用
diff
,再次获得
符号
而不是
diff
,以获得谷值。使用
min
获取最低值

#Value
sapply(df, function(x) min(x[1+which(diff(sign(diff(x))) == 2)]))
#x y z 
#3 3 1

#Position
sapply(df, function(x) {
    tt <- 1+which(diff(sign(diff(x))) == 2)
    tt[which.min(x[tt])] })
#x y z 
#3 3 4 

如何计算最小转折点?如何得到x=c(2,5,3,6,1,1,1)的3?对于x,转折点在3,因为3之前和之后的值都大于它。谢谢。
sapply(df,function(x)x[which.max(diff(x)<0)+1])
可以工作。虽然
z
不清楚-它也应该等于
3
,不是吗?如9>3。还有,你是在寻找转折点的价值还是它的位置?@Davidernburg,我想得到转折点的价值和位置。对于z,3也是一个转折点,但我想得到1处的点,因为1小于3。谢谢。对于x,1不是转折点,因为在第6行没有大于1的值。在z中,1之前和之后的值大于它(5,1,4).Ronak,但用户希望结果
3,3,1
,而不是
3,3,3
?谢谢。有可能找到最小转折点所在的位置(哪一行)吗?如果有两个(当然是相同的)转折点怎么办?在这种情况下返回哪个位置?如果有重复,我希望得到第一行。谢谢。为了得到你可以使用的职位:
df%>%总结(跨越(.fns=~哪个(.x==分钟(.x[哪个(滞后(.x)>.x&领先(.x)>.x)])[1])
@kaixVery nice+1,我正是这么想的!有一个古老的循环。@GKi,如果我有一列x,x=c(8,9,3,3,8,1,1),是否可能在位置4得到最小值3。与第4行中的3之后一样,下一个值8大于它。@kaix我使用
rle
添加了一个变量,该变量的值为3,第一个值为3,最后一个位置为4。
peakPosition <- function(x, inclBorders=TRUE) {
  if(inclBorders) {y <- c(min(x), x, min(x))
  } else {y <- c(x[1], x)}
  y <- data.frame(x=sign(diff(y)), i=1:(length(y)-1))
  y <- y[y$x!=0,]
  idx <- diff(y$x)<0
  (y$i[c(idx,F)] + y$i[c(F,idx)] - 1)/2
}

#Value
sapply(df, function(x) min(x[ceiling(peakPosition(-x, FALSE))]))
#x y z 
#3 3 1 

#Position
sapply(df, function(x) {
    tt <- peakPosition(-x, FALSE)
    tt[which.min(x[floor(tt)])] })
#x y z 
#3 3 4 
x <- c(8,9,3,3,8,1,1)
y <- rle(x)
i <- 1 + which(diff(sign(diff(y$values))) == 2)
min(y$values[i]) #Value
#[1] 3
j <- which.min(y$values[i])
1+sum(y$lengths[seq(i[j])-1]) #First Position
#[1] 3
sum(y$lengths[seq(i[j])]) #Last Position
#[1] 4