我有一个包含两列的数据框:
dd <- read.table(text = "
344 0
350 16
366 11
376 8
380 28
397 55
398 45
400 19
402 30
408 20
415 0
")
我想在第二列(55
)中最高值附近的两个最小局部数据之间进行子集化。
结果将是:
376 8
380 28
397 55
398 45
400 19
它必须包含最小的局部函数,因为子数据框的维度是可变的
dd <- read.table(text = "
460 0
461 2
463 16
469 33
471 13
473 23
479 38
480 168
481 0")
答案 0 :(得分:2)
对N个周围值的子集应该如下:
p.max <- which.max(dd$V2)
range <- -2:2
dd[p.max + range, ]
# V1 V2
# 4 376 8
# 5 380 28
# 6 397 55
# 7 398 45
# 8 400 19
要在全局最大值附近的局部最小值之间进行子集,您可以执行以下操作:
dd <- read.table(text = "344 0
350 16
366 11
376 8
380 28
397 55
396 50
398 45
400 19
402 30
408 20
415 0")
library(data.table)
minimums <- function(x) which(x - shift(x, 1) < 0 & x - shift(x, 1, type='lead') < 0)
p.max <- which.max(dd$V2)
local.mins <- minimums(dd$V2)
local.mins <- c(last(local.mins[local.mins < p.max]), first(local.mins[local.mins > p.max]))
dd[local.mins[1]:local.mins[2], ]
我在这里使用了data.table
,因为它有一些有用的功能,如shift
和first
。
minimums
函数取自对此问题的回答:Finding local maxima and minima in R
此代码似乎不适用于不存在局部最小值的情况,例如:最小值是最后一个或第一个。