I'm proposing two solutions but there are many more. The short answer is no, you can't directly sort those characters and expect them to behave like numbers. It will sort alphabetically and the first "letter" of 7.02% is "7" which comes after the "1" in 17.54%
dataset <- data.frame(x=c(rep("Crit1",43),rep("Crit2",10),rep("Crit3",4)))
# Option 1 - make numeric variable, sort by that, then remove it
dataset_table <- as.data.frame(table(dataset[,1]))
dataset_table[,"PourcentageNum"] <- dataset_table[,2]/sum(dataset_table[,2])*100
dataset_table[,"Pourcentage"] <- paste(round(dataset_table$PourcentageNum, digits=2), "%", sep = " ")
dataset_table <- dataset_table[order(dataset_table$PourcentageNum),]
dataset_table[,-3]
#> Var1 Freq Pourcentage
#> 3 Crit3 4 7.02 %
#> 2 Crit2 10 17.54 %
#> 1 Crit1 43 75.44 %
# Option 2 - zero pad your percentage
# need the package stringr
dataset_table <- as.data.frame(table(dataset[,1]))
dataset_table[,"Pourcentage"] <- stringr::str_pad(paste(round(dataset_table[,2]/sum(dataset_table[,2])*100, digits=2), "%", sep = " "), 7, "left", "0")
dataset_table <- dataset_table[order(dataset_table$Pourcentage),]
dataset_table
#> Var1 Freq Pourcentage
#> 3 Crit3 4 07.02 %
#> 2 Crit2 10 17.54 %
#> 1 Crit1 43 75.44 %
Created on 2019-12-27 by the reprex package (v0.3.0)