R 中 group_by 内的条件 Max/Min 值
Conditional Max/Min values within group_by in R
我一直在寻找这个问题的答案,但运气不佳,希望有人能帮助我!
我正在处理周期性数据,我试图找到两个波峰和两个波谷的相关值 - 这不一定等同于 max/min 和第二个 max/min 值,但是而是 max/min 和第二个 max/min 值以 larger/smaller 为条件,而不是前面和后面的值。
这是一个循环的例子
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 对循环进行分组,然后希望在组内应用条件 max/min 参数。
如有任何建议,我将不胜感激,
提前致谢
编辑
我已经使用了下面的函数,只是在最后一行稍作修改
return(data.frame(Data.value=x, Time=y, Date=z,HHT=peak, LLT=trough))
其中 x 是我上面的原始 x,y 是时间变量,z 是日期变量。这使我可以对结果进行一些额外的计算(我需要值为 min/max 的时间以及值本身)。
所以现在我有一个包含我需要的一切的数据框,但它只用于一个日期 - 我仍然无法使用 group_by 函数在整个数据集中得到这个 运行。我尝试使用
按日期进行子设置
subsets<-split(data, data$datevar, drop=TRUE)
但仍然需要一种方法以某种方式 运行 每个子集的 findminmax 函数(以及我的几行额外代码)。有什么想法吗?
考虑以下您可以在 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)
我一直在寻找这个问题的答案,但运气不佳,希望有人能帮助我!
我正在处理周期性数据,我试图找到两个波峰和两个波谷的相关值 - 这不一定等同于 max/min 和第二个 max/min 值,但是而是 max/min 和第二个 max/min 值以 larger/smaller 为条件,而不是前面和后面的值。
这是一个循环的例子
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 对循环进行分组,然后希望在组内应用条件 max/min 参数。
如有任何建议,我将不胜感激,
提前致谢
编辑
我已经使用了下面的函数,只是在最后一行稍作修改
return(data.frame(Data.value=x, Time=y, Date=z,HHT=peak, LLT=trough))
其中 x 是我上面的原始 x,y 是时间变量,z 是日期变量。这使我可以对结果进行一些额外的计算(我需要值为 min/max 的时间以及值本身)。
所以现在我有一个包含我需要的一切的数据框,但它只用于一个日期 - 我仍然无法使用 group_by 函数在整个数据集中得到这个 运行。我尝试使用
按日期进行子设置subsets<-split(data, data$datevar, drop=TRUE)
但仍然需要一种方法以某种方式 运行 每个子集的 findminmax 函数(以及我的几行额外代码)。有什么想法吗?
考虑以下您可以在 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)