【问题标题】:Conditional Max/Min values within group_by in RR中group_by中的条件最大值/最小值
【发布时间】:2016-07-13 10:25:07
【问题描述】:

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

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

这是一个循环的例子

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 是日期变量。这使我可以对结果进行一些额外的计算(我需要值最小/最大值的时间以及值本身)。

所以现在我有一个包含我需要的所有东西的数据框,但它只适用于一个日期 - 我仍然无法使用 group_by 函数在整个数据集中运行它。我已经尝试使用按日期进行子设置

subsets&lt;-split(data, data$datevar, drop=TRUE)

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

【问题讨论】:

    标签: r group-by max dplyr minimum


    【解决方案1】:

    考虑以下您可以在 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)
    

    【讨论】:

    • 感谢@Parfait,此功能运行良好,但我仍然无法按日期分组 - 请参阅我对上述问题的编辑
    • 查看更新。挑战在于您不能从函数返回数据帧,而是从标量值返回。查看修改后的list()return。
    • 我已经用这个来处理试验数据,但是一旦我应用到整个数据集,我就会得到“错误:下标越界”有什么想法吗?我从数据框中删除了包含 NA 的行,但在给定日期可能有 3 个峰/谷或只有 1 个峰/谷,所以这可能会导致问题?
    • 它可能只有 1 个峰值/谷值,因为在 group_by() 中请求了第二个元素,但由于函数没有创建它而不存在。请参阅编辑峰和谷列表用两个空白 -NA 初始化的地方。所以这两个列表总是为第一个和第二个元素返回一些值。
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2018-11-11
    • 2018-01-14
    • 2013-06-05
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多