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