web-dev-qa-db-ja.com

要素にRの文字と数字が含まれる文字ベクトルをソートするにはどうすればよいですか?

文字配列があります

_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()を試しても同じ結果が得られました。

誰かが私を助けてくれますか

36
rinzy kutex

「gtools」パッケージのmixedsortを試してください。

> # 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" 
43

ここにはたくさんの正しい答えがありますが、これは楽しみのための別の方法です。

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

_str_sort_ function(stringr packgから)を使用したコード行のもう1つのソリューション

_# 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"
_
11
JDie

直前の「V」文字を削って、並べ替えベクトルを作成します。追加の派手なツールは必要ありません。

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

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

Rは文字列をアルファベット順に正しく順序付けているため、その結果が得られます。

@Anandaの非常に良い答えとは別に、ベースRを使用する場合は、strsplitを使用して各文字列から「V」を削除し、as.numericは、文字列を整数にキャストします。

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

これで、valsを使用して文字列をソートできます

cf[order(vals)]
3
nico

namessortを利用した基本的なアプローチは次のとおりです(アナンダのものは非常に滑らかでした)。

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"
1
Tyler Rinker