9

次のデータフレームがあります

a = data.frame(a=c(1,2,3,4,5,6,7),b=c(1,2,3,10,12,21,4),c=c(1,2,10,11,"X","Y",3))
> a
  a  b  c
1 1  1  1
2 2  2  2
3 3  3 10
4 4 10 11
5 5 12  X
6 6 21  Y
7 7  4  3

出力(たとえば、列「c」)が次のようになるように、データフレーム全体を辞書順にソートしたい

> a[,"c"]
[1] 1  2  3 10 11  X  Y

試してみましたが、別の答えが得られます

indata <- a[do.call(order,a[,c("c","a","b")]),]
> indata[,"c"]
[1] 1  10 11 2  3  X  Y
Levels: 1 10 11 2 3 X Y

gtools、mixedorder パッケージを試してみたところ、1 つの列で問題なく動作しました。

> a[mixedorder(a$c),]
  a  b  c
1 1  1  1
2 2  2  2
3 3  3 10
4 4 10 11
5 5 12  X
6 6 21  Y
7 7  4  3

複数の列を含めると機能しません。

> a[with(a,order(mixedorder(c),mixedorder(b),mixedorder(a))),]
  a  b  c
1 1  1  1
2 2  2  2
4 4 10 11
5 5 12  X
6 6 21  Y
7 7  4  3
3 3  3 10

私は期待していますが:

  a  b  c
1 1  1  1
2 2  2  2
4 7  4  3
5 3  3 10
6 4 10 11
7 5 12  X
3 6 21  Y
4

4 に答える 4

7

1 つのオプションはmixedorder()gtoolsパッケージから使用することです。

library(gtools)
a[mixedorder(a$c),]
#   a  b  c
# 1 1  1  1
# 2 2  2  2
# 7 7  4  3
# 3 3  3 10
# 4 4 10 11
# 5 5 12  X
# 6 6 21  Y
于 2012-10-09T18:33:36.523 に答える
4

ベースに固執すると、自分で関数を作成できます。

a = data.frame(a=c(1,2,3,4,5,6,7),b=c(1,2,3,10,12,21,4),c=c(1,2,10,11,"X","Y",3))

SORTER_DEVICE <- function(x) {
    c(sort(as.numeric(na.omit(gsub("[a-zA-Z]", NA, x)))),
        sort(na.omit(gsub("[0-9]", NA, x))))
}
data.frame(apply(a, 2, SORTER_DEVICE))
于 2012-10-09T18:48:05.887 に答える
1

残念ながら、mixedsort は (まだ) 複数列の並べ替えをサポートしていません。したがって、たとえば次のように、自分で実装する必要があります。

a[order(sub("[0-9]+", "", a$c),
        as.numeric(sub("[[:alpha:]]*([[:digit:]]*)", '\\1', a$c)),
        as.numeric(a$b),
        as.numeric(a$a)), ]

これは最初に、a$c を使用して data.frame を英数字でソートし、引き分けの状況 (実際には data.frame 'a' には存在しません) の場合は、a$b と a$a を使用します。

出力は次のとおりです。

  a  b  c
1 1  1  1
2 2  2  2
7 7  4  3
3 3  3 10
4 4 10 11
5 5 12  X
6 6 21  Y

PS: これは、同様の質問への回答として、この投稿で David Winsemius によって書かれました。

于 2013-08-14T14:15:31.370 に答える