#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"