2013-07-08 15 views
20

Bir karakter dizisi varÖğelerin R harfleri ve sayıları içerdiği bir karakter vektörü nasıl sıralanır?

cf <- c("V440","V457","V116","V327","V446","V108", 
     "V155","V217","V120","V51","V477") 
Ben böyle bir çıkışı olacaktır, böylece azalan düzende sıralamak istiyorum

: Bu

cf[sort.list(cf)] 
gibi sort.list() denedi

V51 
V108 
V116 
V120 
V155 
V217 
V327 
V440 
V446 
V457 
V477 

ve bu yanıtı aldınız:

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

ve ayrıca order() da denedi ve aynı sonucu elde ettiler.

birisi "gtools" paketinden mixedsort deneyin

cevap

31

bana lütfen yardımcı olabilir:

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

Eğer mixedsort kullanmak istemiyorsanız (emin değilim neden bir olmaz) ve eğer vektörünüzün oldukça tutarlı bir deseni varsa (örneğin, harfleri takip eden harflerle), muhtemelen böyle bir şeyi deneyebilirsiniz. (Not: Nispeten denenmemiş .)

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

sadece bir ayıklama vektörü inşa etmek için önceki "V" karakteri kazıyın. Ek fantezi araç gerektirmez.

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

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

R doğru şekilde dizeleri alfabetik olarak sipariş eder, bu yüzden bu sonucu elde edersiniz. Kenara @Ananda dan

çok iyi cevap, sen tamsayılar için dizeleri döküm için as.numeric kullanmak daha sonra her dizesinden "V" kaldırmak ve strsplit kullanabilirsiniz baz R kullanmak istiyorsanız:

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

Şimdi burada

cf[order(vals)] 
1

valsnames ve sort kullanan bir baz yaklaşımı (Ananda bayağı kaygan oldu) var kullanarak dizeleri sıralayabilirsiniz:

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

Pek çok doğru cevap burada, bu sadece eğlence için başka bir yol.

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