Примените функцию ранжирования сразу к нескольким столбцам

#r

Вопрос:

У меня есть набор данных, который выглядит так:

a b c
24 35 76
27 12 43
29 76 56
34 54 52
76 NA NA

Я хочу рассчитать ранги (используя rank() функцию) для всех 3 сразу. Я думаю apply() , что семья, возможно, будет работать здесь? Или мне было бы лучше с циклом for, так как я перебираю столбцы.

Ответ №1:

Мы можем использовать lapply или sapply

 df2 <- df1
df2[] <- lapply(df1, rank)
 

Или мы можем использовать dplyr

 library(dplyr)
df %>%
  mutate(across(everything(), rank))
 

данные

 df1 <- structure(list(a = c(24L, 27L, 29L, 34L, 76L), b = c(35L, 12L, 
76L, 54L, NA), c = c(76L, 43L, 56L, 52L, NA)), class = "data.frame", 
row.names = c(NA, 
-5L))
 

Ответ №2:

Вы можете использовать ответ Tidyverse на apply семейство функций ( map ). Они работают аналогично apply семейству, но имеют более явное возвращаемое значение, что полезно. Например:

 library(purrr)
map_df(df, rank)
 

Это вернет tibble (data.frame), который вам нужен.

Конечно, вы также можете сделать следующее, если вам нужно базовое решение R:

 as.data.frame(lapply(df, rank))