Как заказать мой лексикографический блок данных

У меня есть следующий фрейм данных

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

Я хочу отсортировать весь фрейм данных в лексикографическом порядке, чтобы вывод (например, столбец "с") должно быть как

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

Я пытался, и я получаю другой ответ

indata  indata[,"c"]
[1] 1  10 11 2  3  X  Y
Levels: 1 10 11 2 3 X Y

Я попробовал gtools, mixedorder package и отлично работал на одной колонке:

> 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
 user163130609 окт. 2012 г., 20:32
Я хочу отсортировать весь фрейм данных относительно c. Я дал [, "с"] для легкого понимания
 joran09 окт. 2012 г., 20:31
Вы'Я должен быть более ясным. Вы хотите отсортировать только столбецcили весь фрейм данных относительно столбцов?c

Ответы на вопрос(3)

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))

mixedsort (пока) не поддерживает сортировку по нескольким столбцам. Итак, вам нужно реализовать это самостоятельно, например, так:

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

Во-первых, алфавитно-цифровая сортировка data.frame с использованием $ c и для ситуаций связывания (которых на самом деле нет в вашем data.frame 'a'), он использует $ b и $ 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: это было написано Дэвидом Winsemius вэта почта в ответ на аналогичный вопрос.

Решение Вопроса

Одним из вариантов является использование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
 user163130609 окт. 2012 г., 20:36
Как бы я использовал несколько столбцов для сортировки (сначала c, затем b, а затем a)?
 joran09 окт. 2012 г., 20:38
@ user1631306 Попробуйтеarrange вplyr пакет.
 Josh O'Brien09 окт. 2012 г., 20:40
@ user1631306 - В этом случае вы можете сделать это:.a[with(a, order(mixedorder(c), b, a)),]

Ваш ответ на вопрос