Error in unique.default(x) : unique() applies only to vectors
3 Réponses :
En utilisant tidyverse
, nous pouvons utiliser mutate
avec across
(à partir de dplyr
1.0.0 ou versions antérieures avec
mutate_at / mutate_all`)
mydata[paste0(names(mydata), "_rank")] <- lapply(mydata, rank)
Si nous devons conserver les row.names (que tidyverse omet), créez une colonne avec des noms de lignes ( rownames_to_column
) et changez plus tard la colonne en rownames
library(tibble) mydata %>% rownames_to_column('rn') %>% mutate(across(-rn, rank, .names = "{col}_rank")) %>% column_to_rownames('rn') # Train Test Train_rank Test_rank #Method1 14.2 10.0 3 1 #Method2 2.2 11.2 1 2 #Method3 11.9 12.0 2 3
Ou avec base R
library(dplyr)# 1.0.0 mydata %>% mutate(across(everything(), rank, .names = "{col}_rank")) # Train Test Train_rank Test_rank #1 14.2 10.0 3 1 #2 2.2 11.2 1 2 #3 11.9 12.0 2 3
J'utiliserais data.table pour cela
library(data.table) mydata <- data.table(Train = c(14.2, 2.2, 11.9), Test = c(10, 11.2, 12)) col_to_rank <- c('Train', 'Test') mydata[, paste0('rank', col_to_rank) := lapply(.SD, rank), .SDcols = col_to_rank]
Vous pouvez utiliser dense_rank
:
library(dplyr) mydata %>% mutate(across(everything(), dense_rank, .names = '{col}_rank')) # Train Test Train_rank Test_rank #1 14.2 10.0 3 1 #2 2.2 11.2 1 2 #3 11.9 12.0 2 3