2013-07-08 20 views
20

Ho un array di caratteriCome ordinare un vettore di caratteri in cui gli elementi contengono lettere e numeri in R?

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

desidero ordinare in ordine decrescente in modo che avrò l'output del tipo:

V51 
V108 
V116 
V120 
V155 
V217 
V327 
V440 
V446 
V457 
V477 

Ho provato sort.list() simili

cf[sort.list(cf)] 

e ottenuto questa risposta:

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

e anche provato order() e ottenuto lo stesso risultato.

Qualcuno può aiutarmi per favore

risposta

31

Prova mixedsort dal "gtools" pacchetto:

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

Se non si desidera utilizzare mixedsort (non so perché non sarebbe) e se il tuo vettore ha uno schema abbastanza coerente (ad esempio lettere seguite da numeri), puoi anche probabilmente provare qualcosa di simile. (Nota: relativamente non testati.)

newvec <- c("V440", "V457", "V116", "V327", "V446", "V108", "V155", 
      "V217", "V120", "V51", "V477", "B22", "A10", "Z01") 

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

Basta raschiare il carattere precedente "V" per costruire un vettore di ordinamento. Non sono necessari strumenti di fantasia aggiuntivi.

vals <- as.numeric(gsub("V","", cf)) 
cf[order(vals)] 

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

R correttamente ordina le stringhe in ordine alfabetico, è per questo che si ottiene quel risultato.

parte @Ananda risposta molto buona, se si desidera utilizzare di base R è possibile utilizzare strsplit per rimuovere il "V" da ogni stringa e quindi utilizzare as.numeric per lanciare le stringhe di numeri interi:

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

ora è possibile ordinare le stringhe utilizzando vals

cf[order(vals)] 
1

Ecco un approccio di base che utilizza names e sort (Ananda di era piuttosto liscia):

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" 
25

Un sacco di risposte giuste qui, questo è un altro modo, solo per divertimento.

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