【问题标题】:How to subset the data to surrounding rows [closed]如何将数据子集到周围的行[关闭]
【发布时间】:2018-04-28 06:44:32
【问题描述】:

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

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

【问题讨论】:

  • 为什么在寻找max 附近的最小值时排除了0

标签: r dataframe subset


【解决方案1】:

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

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

【讨论】:

  • 它必须包含一个最小局部函数。它并不总是介于 -2 和 +2 之间
  • 好吧,那你需要再举一个例子,你的描述+例子不清楚
  • 我又加了一个例子
  • 我已经更新了答案
猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2014-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多