R - 寻找多个最大值
R - Finding muliple max values
我有以下示例数据集
Time <- c(1,2,3,4,5,6,7,8,9,10,11,12)
Value <- c(0,1,2,3,2,1,2,3,2,1,2,3)
Data <- data.frame(Time, Value)
我想自动找到值列的每个最大值,并创建一个仅包含值和关联时间的新数据框。在此示例中,最大值每四个时间间隔出现一次。我想将数据分组到 bin 中并找到关联的最大值。
出于说明目的,我使示例保持简单,但是请记住:
- 我的数据集中的每个最大值都会不同
- 不能保证每个最大值以相等的间隔出现,但我可以保证每个最大值将出现在一个时间值范围(即一个 bin)内。
感谢您在此过程中提供的任何帮助!
您可以通过找到 Value
列的 diff
的 sign
的 diff
为负数的点来找到局部最大值。
Data[which(diff(sign(diff(Data$Value))) < 0) + 1,]
#> Time Value
#> 4 4 3
#> 8 8 3
我们可以看到这在更一般的情况下也有效:
Time <- seq(0, 10, 0.1)
Value <- sin(Time)
Data <- data.frame(Time, Value)
plot(Data$Time, Data$Value)
Data2 <- Data[which(diff(sign(diff(Data$Value))) < 0) + 1,]
abline(v = Data2$Time, col = 'red')
编辑
根据来自 OP 的更多信息,我们似乎正在寻找 120 秒内的最大值 window。既然如此,我们可以这样更容易地得到解决方案:
library(dplyr)
bin_size <- 4 # Used for example only, will be 120 in real use case
Data %>%
mutate(Bin = floor((Time - 1) / bin_size)) %>%
group_by(Bin) %>%
filter(Value == max(Value))
#> # A tibble: 3 x 3
#> # Groups: Bin [3]
#> Time Value Bin
#> <dbl> <dbl> <dbl>
#> 1 4 3 0
#> 2 8 3 1
#> 3 12 3 2
很明显在真实数据中,把bin_size
改成120。
也许是这个?
library(dplyr)
Data %>%
slice_max(Value)
Time Value
1 4 3
2 8 3
3 12 3
我有以下示例数据集
Time <- c(1,2,3,4,5,6,7,8,9,10,11,12)
Value <- c(0,1,2,3,2,1,2,3,2,1,2,3)
Data <- data.frame(Time, Value)
我想自动找到值列的每个最大值,并创建一个仅包含值和关联时间的新数据框。在此示例中,最大值每四个时间间隔出现一次。我想将数据分组到 bin 中并找到关联的最大值。
出于说明目的,我使示例保持简单,但是请记住:
- 我的数据集中的每个最大值都会不同
- 不能保证每个最大值以相等的间隔出现,但我可以保证每个最大值将出现在一个时间值范围(即一个 bin)内。
感谢您在此过程中提供的任何帮助!
您可以通过找到 Value
列的 diff
的 sign
的 diff
为负数的点来找到局部最大值。
Data[which(diff(sign(diff(Data$Value))) < 0) + 1,]
#> Time Value
#> 4 4 3
#> 8 8 3
我们可以看到这在更一般的情况下也有效:
Time <- seq(0, 10, 0.1)
Value <- sin(Time)
Data <- data.frame(Time, Value)
plot(Data$Time, Data$Value)
Data2 <- Data[which(diff(sign(diff(Data$Value))) < 0) + 1,]
abline(v = Data2$Time, col = 'red')
编辑
根据来自 OP 的更多信息,我们似乎正在寻找 120 秒内的最大值 window。既然如此,我们可以这样更容易地得到解决方案:
library(dplyr)
bin_size <- 4 # Used for example only, will be 120 in real use case
Data %>%
mutate(Bin = floor((Time - 1) / bin_size)) %>%
group_by(Bin) %>%
filter(Value == max(Value))
#> # A tibble: 3 x 3
#> # Groups: Bin [3]
#> Time Value Bin
#> <dbl> <dbl> <dbl>
#> 1 4 3 0
#> 2 8 3 1
#> 3 12 3 2
很明显在真实数据中,把bin_size
改成120。
也许是这个?
library(dplyr)
Data %>%
slice_max(Value)
Time Value
1 4 3
2 8 3
3 12 3