1
votes

R: classement des données numériques dans un data.frame

Error in unique.default(x) : unique() applies only to vectors

0 commentaires

3 Réponses :


0
votes

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


0 commentaires

0
votes

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]


0 commentaires

0
votes

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


0 commentaires