如何比较数据框中多个局部最小值之间的值?
how to compare the values among more than one local minima in a dataframe?
我有一个数据框如下 -
df <- cbind(c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3),c(4,8,12,18,21,24,27,1,4,7,10,13,16,19,22,25,28,5,10,15,20,25), c(1.0,0.7,2.0,2.9,1.6,0.6,0.9,2,4,1,8,4,2,0.8,1.2,1.0,0.6,2,9,7,4,5))
colnames(df) <- c("ID","time","value")
所以两个 ID 都有超过 1 个局部最小值。我想确定 post-峰值局部最小值是否大于或小于峰值前局部最小值,并提取 post-峰值局部最小值小于峰值前局部最小值的 ID 和捕捉上升的时间。所以我想创建一个“索引”列,如果峰前局部最小值大于 post-峰值局部最小值,则该列为 0,如果峰前局部最小值小于 post-峰值局部最小值。因此,对于 ID 1 和 2,索引列将为 0,但对于 3,索引列将为 1。随后我想捕获峰值时间。所以最终的数据框会是这样的
df1 <- cbind(c(1,2),c(18,10), c(0,0))
colnames(df1) <- c("ID","time","index")
我可以使用这段代码捕捉上升时间 -
df1 <- df%>%group_by(ID)%>%mutate(peak = which.max(c(diff(value),TRUE)))
df1 <- df1%>%group_by(ID)%>%filter(row_number == peak)
但是,我无法根据峰值前与 post 峰值最小值的比较来捕获“索引”列。
请帮帮我
这有帮助吗?
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
我有一个数据框如下 -
df <- cbind(c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3),c(4,8,12,18,21,24,27,1,4,7,10,13,16,19,22,25,28,5,10,15,20,25), c(1.0,0.7,2.0,2.9,1.6,0.6,0.9,2,4,1,8,4,2,0.8,1.2,1.0,0.6,2,9,7,4,5))
colnames(df) <- c("ID","time","value")
所以两个 ID 都有超过 1 个局部最小值。我想确定 post-峰值局部最小值是否大于或小于峰值前局部最小值,并提取 post-峰值局部最小值小于峰值前局部最小值的 ID 和捕捉上升的时间。所以我想创建一个“索引”列,如果峰前局部最小值大于 post-峰值局部最小值,则该列为 0,如果峰前局部最小值小于 post-峰值局部最小值。因此,对于 ID 1 和 2,索引列将为 0,但对于 3,索引列将为 1。随后我想捕获峰值时间。所以最终的数据框会是这样的
df1 <- cbind(c(1,2),c(18,10), c(0,0))
colnames(df1) <- c("ID","time","index")
我可以使用这段代码捕捉上升时间 -
df1 <- df%>%group_by(ID)%>%mutate(peak = which.max(c(diff(value),TRUE)))
df1 <- df1%>%group_by(ID)%>%filter(row_number == peak)
但是,我无法根据峰值前与 post 峰值最小值的比较来捕获“索引”列。
请帮帮我
这有帮助吗?
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