如何比较数据帧中多个局部最小值之间的值?

问题描述

我有一个如下的数据框 -

df <- cbind(c(1,1,2,3,3),c(4,8,12,18,21,24,27,4,7,10,13,16,19,22,25,28,5,15,20,25),c(1.0,0.7,2.0,2.9,1.6,0.6,0.9,0.8,1.2,1.0,9,5))
colnames(df) <- c("ID","time","value")

因此这两个 ID 都有 1 个以上的局部最小值。我想确定峰值后局部最小值是大于还是小于峰值前局部最小值,并提取峰值后局部最小值小于峰值前局部最小值的 ID 并捕获上升时间。因此,我想创建一个列“索引”,如果峰值前局部最小值大于峰值后局部最小值,则该列将为 0,如果峰值前局部最小值小于峰值后局部最小值,则该列将等于 1 .因此,对于 ID 1 和 2,索引列将为 0,但对于 3,它将为 1。随后我想捕获峰值的时间。所以得到的数据帧将是这样的

df1 <- cbind(c(1,2),c(18,10),c(0,0))
colnames(df1) <- c("ID","index")

我可以使用此代码捕获上升时间 -

df1 <- df%>%group_by(ID)%>%mutate(peak = which.max(c(diff(value),TRUE)))
df1 <- df1%>%group_by(ID)%>%filter(row_number == peak)

但是,我无法根据峰值前与峰值后最小值的比较来捕获“索引”列。

请帮帮我。

解决方法

这有帮助吗?

library(dplyr)

df %>%
  group_by(ID) %>%
  slice(which.max(value)) %>%
  ungroup %>%
  mutate(index = as.integer(lead(time,default = Inf) > time)) %>%
  filter(index == 0)

#     ID  time value index
#  <dbl> <dbl> <dbl> <int>
#1     1    18   2.9     0
#2     2    10   8       0