Получить номер строки, при котором переменная достигла максимального значения в столбце R фрейма данных

#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
 

Шаги этого:

  1. Сначала транспонируйте данные:
     > 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
     
  2. Затем получите столбец с максимальным значением для каждой строки:
     > 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 . in dplyr означает данные в самом канале. В этом случае не имеет значения . и .x .

4. Data %>% summarise(across(everything(), which.max))