如何将数据子集化到周围的行

时间:2018-04-27 22:15:10

标签: r dataframe subset

我有一个包含两列的数据框:

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")

1 个答案:

答案 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,因为它有一些有用的功能,如shiftfirst

minimums函数取自对此问题的回答:Finding local maxima and minima in R

此代码似乎不适用于不存在局部最小值的情况,例如:最小值是最后一个或第一个。