Дополнительно
Как отсортировать фрейм данных по нескольким столбцам (столбцам)
Я хочу отсортировать data.frame по нескольким столбцам. Например, в приведенном ниже файле data.frame я хочу отсортировать по столбцу z
(по убыванию), затем по столбцу b
(по возрастанию):
dd <- data.frame(b = factor(c("Hi", "Med", "Hi", "Low"),
levels = c("Low", "Med", "Hi"), ordered = TRUE),
x = c("A", "D", "A", "C"), y = c(8, 3, 9, 9),
z = c(1, 1, 1, 2))
dd
b x y z
1 Hi A 8 1
2 Med D 3 1
3 Hi A 9 1
4 Low C 9 2
1263
19
Вы можете использовать функцию
order()
напрямую, не прибегая к дополнительным инструментам - смотрите этот более простой ответ, в котором используется трюк прямо из верхней части кодаexample(order)
:Редактирование спустя 2+ года: Только что был задан вопрос, как сделать это по индексу столбца. Ответ заключается в том, чтобы просто передать нужный столбец(ы) сортировки в функцию
order()
:а не использовать имя столбца (и
with()
для более простого/прямого доступа).Ваш выбор
приказ
отбазы
договориться
сdplyr
setorder
иsetorderv
сданных.стол
договориться
сplyr
вроде
отtaRifx
заказпо
оттело
sortData
отDeducer
Большую часть времени вы должны использовать
dplyr
илиданных.таблица решений, если у вас нет зависимостей имеет большое значение, в этом случае основание использовать::заказ
.Недавно я добавил.данных.рамка для клюквенно пакет, что делает его совместимым класса, как описано здесь: https://stackoverflow.com/questions/6836963/best-way-to-create-generic-method-consistency-for-sort-data-frame
Поэтому, учитывая данные.рама ДД, можно сортировать следующим образом:
Кортик'ы ответ велик. В нем также подчеркивается ключевая разница в синтаксис, используемый для индексирования данных`.рама и данных.таблицы:
Разница между двумя вызовами небольшой, но это может иметь важные последствия. Особенно если вы пишете код и/или связаны с правильностью в своих исследованиях, он'ы лучше, чтобы избежать ненужных повторение имен переменных. данные.стол` поможет вам сделать это.
Здесь'ы пример того, как повторение имен переменных может получить вас в беде:
Позвольте's поменять контекст от Dirk'ы ответ, и сказать, что это часть более крупного проекта, где есть много имен объектов и они длинные и содержательные; вместо " ч " это's посетило
quarterlyreport
. Она становится :Ок, хорошо. Ничего плохого в этом нет. Следующий ваш босс просит вас включить в последнем квартале'ы в отчете. Вы идете через ваш код, добавление объекта `lastquarterlyreport в разных местах и как-то (как?) вы в конечном итоге с этим :
Что это'т то, что вы имели в виду но вы не'т это место потому что вы сделали это быстро, и это'ы, расположенный на странице подобный код. Код не'т упасть (без предупреждения и без ошибок), потому что Р думает, что именно это вы имели в виду. Вы'd надеюсь, что тот, кто читает ваш доклад замечает его, но, возможно, они не'т. Если вы работаете с языками программирования очень много, то эта ситуация может быть всем знакомы. Это было на "опечатка" Вы'Лл сказать. Я'МР исправить на "опечатка" Вы'будете говорить с вашим боссом.
В
данных.Таблица
мы'вновь обеспокоены крошечный такой детали. Так что мы'ве сделали что-то простое, чтобы не вводить дважды имена переменных. Что-то очень простое. " я "оценивается в рамках" ДД " уже автоматически. Вы Don'т необходимость `С () на всех.Вместо
это's просто
И вместо того, чтобы
это's просто
Это's очень маленькая разница, но это может быть просто спасти вашу шею один день. При взвешивании разных ответов на этот вопрос, считают подсчет повторений имен переменных в качестве одного из критериев при принятии решения. Некоторые ответы достаточно нескольких повторов, другие нет.
Есть много хороших ответов здесь, но dplyr дает только синтаксис, я могу быстро и легко запомнить (и так сейчас очень часто пользуюсь):
Для ОП'ы проблемы:
Данные пакет R
.таблица
обеспечивает как быстро и эффективная память заказ данных.столы простой синтаксис (часть из которых Мэтт подчеркнуто достаточно хорошо в ответ). Там было довольно много улучшений, а также новые функции setorder()с тех пор. От В1.9.5+
, `setorder () также работает с данных.кадров.Во-первых, мы'Лл создать набор данных достаточно большой и сопоставлять различные методы, упомянутые из других ответов, а затем перечислите особенности сведения.стол.
Данные###:
Показателей:
Время в заявление от работающей системы`.время (...) на эти функции показаны ниже. Тайминги приведены в таблице ниже (при заказе от минимальных до максимальных).
данных.стол
'ы
ДТ[порядок(...)]синтаксис был **~10х** быстрее, чем самый быстрый из других методов (
dplyr), при этом потребляя такое же количество памяти как
dplyr`.данных.стол
'ы
setorder()был **~14х** быстрее, чем самый быстрый из других методов (
dplyr), а с **всего 0,4 ГБ дополнительной памяти**.
дат` теперь в порядке, мы требуем (как он обновляется по ссылке).данные###.особенности таблицы:
Скорость:
данные.таблица'сек заказ очень быстро, потому что он реализует заказ радикса.
ДТ синтаксис
[порядок(...)]
оптимизирован внутренне в использовании сведения.таблица'ы быстрый заказ, а также. Вы можете продолжать использовать привычные базовый синтаксис R, но ускорить процесс (и использовать меньше памяти).Память:
ДФ <- ДФ[порядок(...)]
Вопрос в том, что для этого требуется как минимум в два раза (2х) память исходного объекта. Чтобы быть эффективной памяти, данных.таблица* поэтому также предоставляет функции setorder()`.
setorder()
переупорядочивает сведения.таблицыссылка
(в), без внесения каких-либо дополнительных копий. Он использует только дополнительную память, равную размеру одного столбца.Другие особенности:
целое
,логическое
,цифровой
,символ
и дажеbit64::типы integer64
.-
на векторный характер для сортировки по этому столбцу в порядке убывания. Вместо этого мы должны использовать-xtfrm(.)
.Однако, в данных.таблица мы можем просто сделать, например,
дат[порядок(-х)]
илиsetorder(дат, -х)
.С помощью этой (очень полезной) функции Кевина Райта, опубликованной в разделе советов в R wiki, этого легко добиться.
или вы можете использовать пакет доби
Предположим, у вас есть данные
.рамка
A
и вы хотите отсортировать их, используя столбец под названием " Х " в порядке убывания. Вызов данных, отсортированных.рамка
newdata
если SQL естественно для вас, - sqldf пакет ручки
порядок
как Кодди предназначены.В качестве альтернативы, используя пакет Deducer
Я узнал о "заказе" со следующим примером, который потом смутило меня в течение длительного времени:
Единственная причина, этот пример работает, потому что "порядок" - это сортировка по `вектор возрасту, а не по графе "возраст" в данных кадра данных.
Чтобы увидеть это создание одинаковых фрейма данных, используя прочитанное.стол с немного разными названиями колонок и без использования любой из вышеперечисленных векторов:
Дирк'ы ответ хороший, но если вам нужен такой, чтобы сохраняться вы'll хочу применить все на имени фрейма данных. Используя пример кода:
В ответ на замечание, добавил в ОП для сортировки программно:
С помощью dplyr
и
данных.стол`dplyr # Просто используйте
arrange_
, который в стандартной версии оценки дляорганизовать
.Упорядочить() в dplyer-мой любимый вариант. Использовать оператор трубы и перейти от наименее важных к наиболее важным аспектом
Для полноты картины: вы также можете использовать функцию
sortByCol()
отBBmisc
пакет:Сравнение производительности:
Просто как механические сортировщики карту давно, сначала вроде как наименее важные, затем следующий наиболее значимый и т. д. Не требуется библиотека, работает с любым количеством ключей и любое сочетание восходящих и нисходящих ключей.
Просто для полноты картины, поскольку не так много было сказано о сортировке по столбцу цифр... это можно с уверенностью утверждать, что это часто не желательно (потому что порядок столбцов может меняться, прокладывая путь к ошибкам), но в некоторых конкретных ситуациях (когда, например, вам нужно быстро и нет такого риска столбцов, изменение ордеров), это может быть наиболее разумная вещь, чтобы сделать, особенно когда имеешь дело с большим количеством столбцов.
В этом случае делать.звоните()` приходит на помощь:
Другая альтернатива, с помощью РГР пакет:
Я боролся с одним из описанных выше способов, когда я хотел автоматизировать процесс заказа для n столбцов, столбец, чьи имена могут быть разными каждый раз. Я нашла супер полезная функция из
психушки
пакет для этого простым способом:где columnIndices являются показатели одного или нескольких столбцов, в том порядке, в котором вы хотите отсортировать их. Более подробная информация здесь:
функция dfOrder от 'псих' пакет