当前位置: 首页 > 知识库问答 >
问题:

R 中 group_by 范围内的条件最大值/最小值

黄君博
2023-03-14

我一直在寻找这个问题的答案,但运气不佳,所以希望有人能帮助我!

我正在处理周期性数据,我试图找到两个波峰和两个波谷的相关值——这不一定等同于最大/最小和第二个最大/最小值,而是最大/最小和第二个最大/最小值,条件是该值大于/小于前面和后面的值。

这是一个循环的例子

x <- c(3.049, 3.492, 3.503, 3.429, 3.013, 2.881, 2.29, 1.785, 1.211, 0.890, 0.859, 0.903, 1.165, 1.634, 2.073, 2.477, 3.162, 3.207, 3.177, 2.742, 2.24, 1.827, 1.358, 1.111, 1.063, 1.098, 1.287, 1.596, 2.169, 2.292)

我有 1000 个周期,所以我在 dplyr 中使用group_by对周期进行分组,然后希望在组中应用条件最大值/最小值参数

我很感激任何建议,

先谢谢了

此后,我使用了下面的函数,只对最后一行稍加编辑

  return(data.frame(Data.value=x, Time=y, Date=z,HHT=peak, LLT=trough)) 

其中x是上面的原始x,y是时间变量,z是日期变量。这允许我对结果进行一些额外的计算(我需要值为min/max的时间以及值本身)。

所以现在我有了一个包含我需要的所有内容的数据框架,但是它只适用于一个日期——我仍然无法使用group_by函数运行整个数据集。我尝试过按日期进行子设置

子集

但是仍然需要为每个子集运行findminmax函数(以及我的几行额外代码)的方法。有什么想法吗?


共有1个答案

闾丘高峰
2023-03-14

请考虑以下可在 dplyr group_by() 过程中传递的自定义函数。本质上,函数遍历循环值列表,并比较它之前和之后的邻居。峰的邻居既比自身低,低谷的邻居也比自己大。

findminmax <- function(x){
  peak <- list(NA, NA)                              # INITIALIZE TEMP LISTS AND ITERATORS
  p <- 1
  trough <- list(NA, NA)
  t <- 1

  for (i in 1:length(x)){
    if (i != 1 & i != length(x)){                   # LEAVES OUT FIRST AND LAST VALUES
      if ((x[i] > x[i-1]) & (x[i] > x[i+1])) {      # COMPARES IF GREATER THAN NEIGHBORS
        peak[p] <- x[i]
        p <- p + 1
      }
      if ((x[i] < x[i-1]) & (x[i] < x[i+1])){       # COMPARES IF LESS THAN NEIGHBORS
        trough[t] <- x[i]
        t <- t + 1
      }
    }
  }
  return(list(peak1=peak[[1]], peak2=peak[[2]], 
              trough1=trough[[1]], trough2=trough[[2]]))
}

result <- findminmax(x)
#$peak1
#[1] 3.503    
#$peak2
#[1] 3.207    
#$trough1
#[1] 0.859    
#$trough2
#[1] 1.063

对于dplyr的group_by:

finaldf <- originaldf %>% 
             group_by(z) %>% 
                summarise(Time = mean(y),
                          HHT1 = findminmax(x)$peak1,
                          HHT2 = findminmax(x)$peak2,
                          LLT1 = findminmax(x)$trough1,
                          LLT2 = findminmax(x)$trough2)
 类似资料:
  • 问题内容: 最近在一次采访中有人问我这个问题。 给定以下代码,静态整数的最小和最大可能值是多少? 我告诉他们,最大值将为25(在没有竞争条件的情况下),而最小值将为5(在每次迭代时所有线程之间的竞争条件的情况下)。 但是面试官说,最小值甚至可以低于5。这 怎么可能? 问题答案: 我声称最小值可能是2。 这样做的关键是的非原子性,即它是读和写,它们之间可能有其他操作。 调用线程T1..T5: T1读

  • 我在让范围过滤器更具动态性方面遇到了问题。 过滤代码: 而不是硬编码的最小值0和最大值100,我想得到字段verkoopprijs的最小值和最大值。 搜索结果如下所示: 然而我不知道如何得到最小值和最大值。

  • 问题内容: 我有以下三个简单的T-SQL查询。第一个是获取一定范围内的记录(DATETIME类型): 第二个是获取最接近@startDT的记录(DATETIME类型) 最后一个是获取@endDT之后最接近的记录: 我想将以上三个查询的所有记录作为一组记录。我尝试使用UNION,但似乎UNION中的子查询不允许使用ORDER BY子句。有没有有效的方法来得到我的结果? 上图仅将* s的记录显示为我的

  • 具有以下矩阵: 我想只得到每行的最小范围在2到30之间的行。 每行的最小范围: 所以我们只得到[2]和[3] 每行的最大范围在0到160之间: 最后我们只得到满足这两个条件的[2]。你能提供一个R语言函数来生成这个结果吗? 问候迪米特里斯

  • 给定max number和range number,我希望打印出以下内容,但尽可能简短。我不知道这是否可以通过IntStream实现。 输入:max=36(或任意数)范围=10(或任意数) 输出:0-910-1920-2930-35 我的代码:

  • 本文向大家介绍如何找到R中向量的最小值和最大值的索引?,包括了如何找到R中向量的最小值和最大值的索引?的使用技巧和注意事项,需要的朋友参考一下 在分析项目中进行数据探索时,有时我们需要找到一些值的索引,主要是最小值和最大值的索引,以检查相应的数据行是否包含一些关键信息,或者我们可能会忽略它。此外,如果我们不想忽略它们,有时会根据数据特征将这些值转换为另一个值。 示例