Как найти минимальное значение между двумя значениями с помощью R

#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 . Смотрите Обновленный ответ, если это поможет.