59

文字配列があります

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

次のような出力が得られるように、降順で並べ替えたいと思います。

V51
V108
V116
V120
V155
V217
V327
V440
V446
V457
V477

sort.list()私はこのように試しました

cf[sort.list(cf)]

そしてこの答えを得ました:

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

また、試してみorder()て、同じ結果を得ました。

誰か助けてくれませんか

4

6 に答える 6

64

mixedsort「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"

使用したくない場合mixedsort(使用しない理由がわからない場合)、ベクトルのパターンがかなり一貫している場合 (文字の後に数字が続くなど) は、おそらく次のような方法を試すこともできます。(注:比較的テストされていません。 )

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" 
于 2013-07-08T16:21:11.847 に答える
61

ここにはたくさんの正解がありますが、これは別の方法です。

cf[order(nchar(cf), cf)]
# [1] "V51"  "V108" "V116" "V120" "V155" "V217" "V327" "V440" "V446" "V457" "V477"
于 2013-07-08T16:35:11.933 に答える
2

namesand を利用した基本的なアプローチsortは次のとおりです(Ananda'sはかなり巧妙でした):

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"
于 2013-07-08T16:29:51.057 に答える