Возвращает два или более максимальных равных значения

#r #dataframe

Вопрос:

Я намерен вернуть время суток в колонку, в которой было принято наибольшее количество мер. В качестве примера я обнаружил, что самые высокие числа в этом списке-16:10 и 16:20. Я использую which.max(col) функцию, но она возвращает только одно вхождение, а не все. Каков наилучший способ вернуть два (или более) равных максимальных значения?

Обновление: Если я подведу итоги на основе столбца colSums , как я могу также вернуть максимальные значения? (например, 16:10 и 16:20) Структура данных:

введите описание изображения здесь

Желаемый результат: 16:10 16:20

Примеры данных:

 structure(list(Duration = c(10, 20, 30, 40, 50, 60), `16:00` = c(1, 
0, 0, 0, 1, 0), `16:10` = c(0, 0, 0, 2, 1, 0), `16:20` = c(0, 
0, 0, 2, 1, 0)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L), spec = structure(list(cols = list(
    Duration = structure(list(), class = c("collector_double", 
    "collector")), `16:00` = structure(list(), class = c("collector_double", 
    "collector")), `16:10` = structure(list(), class = c("collector_double", 
    "collector")), `16:20` = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1L), class = "col_spec"))
 

Ответ №1:

Сравните max значение со значениями во фрейме данных и верните имена столбцов, в которых по крайней мере 1 вхождение максимального значения.

 tmp <- df[-1]
names(tmp)[colSums(tmp == max(tmp)) > 0]
#[1] "16:10" "16:20"
 

Для обновления это должно сработать —

 tmp <- colSums(df[-1])
names(tmp)[tmp == max(tmp)]
#[1] "16:10" "16:20"
 

Комментарии:

1. Обновил свой ответ.

Ответ №2:

Работает ли это:

 colnames(df)[apply(df,2,function(x) any(x == max(df[-1])))]
[1] "16:10" "16:20"
 

Ответ №3:

Это также может быть сделано с помощью комбинации базы R и tidyverse :

 library(dplyr)

df[-1] %>%
  select(where(~ sum(.x) == max(colSums(df[-1])))) %>%
  names()

[1] "16:10" "16:20"
 

Ответ №4:

Мы можем использовать base R

 v1 <- sapply(df1[-1], max)
names(which(v1 == max(v1)))
#[1] "16:10" "16:20"
 

Или с tidyverse

 library(dplyr)
library(tidyr)
df1 %>%
     summarise(across(-Duration, max)) %>% 
     pivot_longer(everything()) %>%
     filter(value == max(value))%>% 
     pull(name)
[1] "16:10" "16:20"