1

たとえば、次のようなベクトルがあります。

v1<- c("p 1", "p 2", "p 10", "p 11")

sort(v1)を使用して並べ替えると、

[1] "p 1"  "p 10" "p 11" "p 2" 

ただし、sort(v1)が必要です

[1] "p 1"  "p 2" "p 10" "p 11"

ヘルプ ファイルに基づくと、sort字句順序が許可されていないようです。追加のパッケージをインストールしなくても字句順序付けがまったく可能かどうか疑問に思います。

4

2 に答える 2

4

のコードを見て、mixedsort自分で R に入力することができます。その後、追加のパッケージをインストールせずに機能を利用できます。

orderまたは、文字列を断片に分割した後に関数を使用できます。

1 <- c('p 1', 'q 2','p 2','p 11', 'p 10')
sort(v1)

tmp <- strsplit(v1, ' +')
tmp1 <- sapply(tmp, '[[', 1)
tmp2 <- as.numeric(sapply(tmp, '[[', 2))
v1[ order( tmp1, tmp2 ) ]

または、メソッドを記述しxtfrmてベクターに適切なクラスを与えることで、これを自動化できます。

xtfrm.mixed <- function(x) {
    tmp <- strsplit(x, ' +')
    tmp1 <- sapply(tmp, '[[', 1)
    tmp2 <- as.numeric(sapply(tmp, '[[', 2))
    tmp3 <- rank(tmp1, ties.method='min')
    tmp4 <- rank(tmp2, ties.method='min')
    tmp3+tmp4/(max(tmp4)+1)
}

class(v1) <- 'mixed'
sort(v1)

すべてのデータが「p」で始まる場合は、それを取り除いて数値に強制し、 in で使用できますorder

于 2013-03-21T19:35:45.053 に答える
4

これが1つの方法です。数字がゼロでパディングされたベクトルを作成し、このベクトルでソートします。

v1.padded <- mapply(gsub, list('\\d+'), sprintf('%.4d', as.numeric(regmatches(v1, gregexpr('\\d+', v1)))), v1)
# "p 0001" "p 0002" "p 0010" "p 0011"
v1[order(v1.padded)]
# "p 1"  "p 2"  "p 10" "p 11"

文字列に複数の数字がある状況に一般化する 2 番目の方法を次に示します。

v1<- c("p 1 1", "p 11 1", "p 1 2", "p 2 3", "p 10 4")
parallel.split <- lapply(data.frame(do.call(rbind, strsplit(v1, ' ')), stringsAsFactors=FALSE), type.convert, as.is=TRUE)
inter <- do.call(interaction, c(parallel.split, list(lex.order=TRUE)))
v1[order(inter)]
# [1] "p 1 1"  "p 1 2"  "p 2 3"  "p 10 4" "p 11 1"
于 2013-03-21T16:05:55.790 に答える