Wie sortiere ich einen Zeichenvektor, in dem Elemente Buchstaben und Zahlen in R enthalten?

Ich habe ein Zeichen-Array

cf <- c("V440","V457","V116","V327","V446","V108", "V155","V217","V120","V51","V477") 

Ich möchte es in absteigender Reihenfolge sortieren, damit ich eine Ausgabe wie folgt habe:

 V51 V108 V116 V120 V155 V217 V327 V440 V446 V457 V477 

Ich habe sort.list() so ausprobiert

 cf[sort.list(cf)] 

und habe diese Antwort:

 [1] "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477" "V51" 

und versuchte auch order() und bekam dasselbe Ergebnis.

Kann mir bitte jemand helfen?

    Probieren Sie mixedsort aus dem Paket “gtools”:

     > # install.packages("gtools") ## Uncomment if not already installed > library(gtools) > mixedsort(cf) [1] "V51" "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477" 

    Wenn Sie nicht mixedsort verwenden mixedsort (nicht sicher, warum das nicht der Fall ist), und wenn Ihr Vektor ein ziemlich konsistentes Muster hat (zB Buchstaben gefolgt von Zahlen), können Sie wahrscheinlich auch so etwas ausprobieren. (Hinweis: Relativ ungetestet. )

     newvec < - c("V440", "V457", "V116", "V327", "V446", "V108", "V155", "V217", "V120", "V51", "V477", "B22", "A10", "Z01") newvec[order(gsub("([AZ]+)([0-9]+)", "\\1", newvec), as.numeric(gsub("([AZ]+)([0-9]+)", "\\2", newvec)))] # [1] "A10" "B22" "V51" "V108" "V116" "V120" "V155" "V217" "V327" "V440" # [11] "V446" "V457" "V477" "Z01" 

    Viele richtige Antworten hier, das ist ein anderer Weg, nur zum Spaß.

     cf[order(nchar(cf), cf)] # [1] "V51" "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477" 

    Ziehen Sie einfach das vorhergehende “V” -Zeichen ab, um einen Sortiervektor zu erstellen. Keine zusätzlichen ausgefallenen Werkzeuge erforderlich.

     vals < - as.numeric(gsub("V","", cf)) cf[order(vals)] [1] "V51" "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" [10] "V457" "V477" 

    R sortiert die Strings alphabetisch korrekt, deshalb erhalten Sie das Ergebnis.

    Abgesehen von @Ananda sehr gute Antwort, wenn Sie Base R verwenden strsplit , können Sie strsplit , um das “V” aus jeder Zeichenfolge zu entfernen und dann as.numeric , um die Zeichenfolgen in Ganzzahlen zu as.numeric :

     vals < - as.numeric(sapply(cf, FUN=function(x){strsplit(x, "V")[[1]][2]})) 

    Jetzt können Sie Ihre Strings mit vals sortieren

     cf[order(vals)] 

    Hier ist ein Basisansatz mit names und sort (Ananda’s war ziemlich glatt):

     cf < - c("V440","V457","V116","V327","V446","V108", "V155","V217","V120","V51","V477") cf2 <- as.numeric(gsub("[^[:digit:]]", "", cf)) names(cf2) <- seq_along(cf2) cf[as.numeric(names(sort(cf2)))] ## > cf[as.numeric(names(sort(cf2)))] ## [1] "V51" "V108" "V116" "V120" "V155" "V217" "V327" ## [8] "V440" "V446" "V457" "V477" 

    Eine weitere Lösung in einer Codezeile mit der function str_sort (aus dem stringr Packg)

     # install.packages("stringr") ## Uncomment if not already installed library(stringr) 

    str_sort(cf, numeric = TRUE)

     [1] "V51" "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"