#r #dataframe
Вопрос:
мне нужна помощь, чтобы найти номер строки, который имеет максимальное значение для каждого столбца
Data = data.frame(
V1 = c(0.1, 0.2, 0.4, 0.7, 0.9),
v2 = c(0.1, 0.12, 0.41, 0.72, 0.91),
v3 = c(0.03, 0.13, 0.92, 0.50, 0.90))
Желаемый результат: (время достижения максимального значения)
V1 V2 V3
1 5 5 3
Я пробовал это, но безуспешно:
lapply(Data, function(x) (which(max(x))))
Комментарии:
1. Ваша попытка сработает, если вы измените значение на
function(x) which(x == max(x))
. (Но, конечно, специальное назначениеwhich.max
быстрее.)2.
lapply(Data, which.max)
,summarise_all(Data, which.max)
,map_dbl(Data, which.max)
,sapply(Dat, which.max)
и т.д. и т.п.
Ответ №1:
Я бы использовал max.col
и t
из базы R:
max.col(t(Data))
Вывод:
[1] 5 5 3
Шаги этого:
- Сначала транспонируйте данные:
> t(Data) [,1] [,2] [,3] [,4] [,5] V1 0.10 0.20 0.40 0.70 0.90 v2 0.10 0.12 0.41 0.72 0.91 v3 0.03 0.13 0.92 0.50 0.90
- Затем получите столбец с максимальным значением для каждой строки:
> max.col(t(Data)) [1] 5 5 3 >
Или apply
:
apply(Data, 1, which.max)
Ответ №2:
Просто используя dplyr::across
library(dplyr)
Data %>%
summarise(across(everything(), ~which.max(.x)))
V1 v2 v3
1 5 5 3
Или с помощью sapply
,
sapply(Data, function(x) which.max(x))
V1 v2 v3
5 5 3
Комментарии:
1. Подсказка, вам не нужна функция:
sapply(Data, which.max)
2. Я понял, используя . вместо .x in
~which.max(.x)
дает тот же результат. Не могли бы вы кратко объяснить использование .x?3. @Desmond
.
indplyr
означает данные в самом канале. В этом случае не имеет значения.
и.x
.4.
Data %>% summarise(across(everything(), which.max))