#r
#r
Вопрос:
В столбце данных я пытаюсь определить минимальное значение между новым максимумом и предыдущим новым максимумом. В приведенном ниже примере я отметил, где находятся новые максимумы и какое минимальное значение находится между ними. Какова формула R, чтобы понять это? В Excel я мог бы сделать это, используя формулу соответствия и max / min. Я не уверен, как найти минимальное значение в сегменте столбца в r.
data
0 New High
-80
-160
-160
-160
-160
-160
-347
-351
-351
-444
-444
-444
43 New High -444
43
10
10
-6
20
352 New High -6
352
352
528 New High 352
528
511
511
518
472
Ответ №1:
Вы можете использовать cummax
для вычисления кумулятивного максимума до этой строки и создавать новую группу всякий раз, когда значение текущей строки больше предыдущего cummax
значения. Внутри каждой группы вы можете вернуть минимальное значение.
library(dplyr)
df %>%
group_by(group = cumsum(V1 > lag(cummax(V1), default = first(V1)))) %>%
summarise(min_value = min(V1))
# group min_value
# <int> <int>
#1 0 -444
#2 1 -6
#3 2 352
#4 3 472
Это рассматривает последнюю часть как другую группу, следовательно, также возвращает минимальное значение в этой части. Вы можете удалить последнюю строку, если она не нужна.
Чтобы применить к нескольким столбцам, мы можем написать функцию и вызвать ее с помощью lapply
:
apply_fun <- function(data, col) {
col1 <- sym(col)
df %>%
group_by(group = cumsum(!!col1 > lag(cummax(!!col1),
default = first(!!col1)))) %>%
summarise(min_value = min(!!col1))
}
result <- lapply(names(df), apply_fun, data = df)
данные
df <- structure(list(V1 = c(0L, -80L, -160L, -160L, -160L, -160L, -160L,
-347L, -351L, -351L, -444L, -444L, -444L, 43L, 43L, 10L, 10L,
-6L, 20L, 352L, 352L, 352L, 528L, 528L, 511L, 511L, 518L, 472L
)), class = "data.frame", row.names = c(NA, -28L))
Комментарии:
1. Спасибо за быстрый ответ. Я не был знаком с dplyr. Есть ли какой-нибудь способ обернуть этот код в функцию apply в base R, чтобы он выполнял вычисления для миллиона разных столбцов? Что-то вроде apply(df,2,function (x) {df %>% group_by(group = cumsum(x > lag(cummax(x), default = first(x)))) %>% summarise(min_value = min(x)}))
2. @Eric Вместо
apply(df, 2.....
я думаю, что лучше использоватьlapply
. Смотрите Обновленный ответ, если это поможет.