Сортировка столбцов фрейма данных по имени столбца


93

Возможно, это простой вопрос, но я не знаю, как расположить столбцы в алфавитном порядке.

test = data.frame(C = c(0, 2, 4, 7, 8), A = c(4, 2, 4, 7, 8), B = c(1, 3, 8, 3, 2))

#   C A B
# 1 0 4 1
# 2 2 2 3
# 3 4 4 8
# 4 7 7 3
# 5 8 8 2

Мне нравится упорядочивать столбцы по именам столбцов в алфавитном порядке, чтобы добиться

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Для других я хочу свой собственный определенный порядок:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Обратите внимание, что мои наборы данных огромны, с 10000 переменными. Так что процесс нужно автоматизировать.

Ответы:


137

Вы можете использовать orderна names, и использовать, чтобы упорядочить столбцы при Подменю:

test[ , order(names(test))]
  A B C
1 4 1 0
2 2 3 2
3 4 8 4
4 7 3 7
5 8 2 8

Для вашего собственного определенного порядка вам нужно будет определить собственное сопоставление имен с порядком. Это будет зависеть от того, как вы хотите это сделать, но замена любой функции на this с orderуказанным выше должна дать желаемый результат.

Вы можете, например, взглянуть на Порядок строк фрейма данных в соответствии с целевым вектором, который указывает желаемый порядок , то есть вы можете matchсопоставить свой фрейм данных namesс целевым вектором, содержащим желаемый порядок столбцов.


3
Чтобы уточнить, test [, c (2,3,1)] или test [, c ('A', 'B', 'C')] произведет порядок столбцов A, B, C. Оператор «[» очень умно определяет, что вы хотите сделать.
Карл Виттхофт,

2
спасибо, со вторым вопросом разобрался с предоставленной помощью; myorder = c («B», «A», «C»), test [, myorder]
Джон Кларк

Есть ли способ отсортировать столбцы так, как я хочу (скажем, CAB)?
TYZ

Вы можете воспользоваться тем фактом, что data.frame представляет собой список, и упростить его :: test[ order(names(test)) ]
ctbrown

1
@naco None, прочитайте источник colnames: он заканчивает вызов namesдля data.frame.
Джеймс

27

Вот обязательный dplyrответ на тот случай, если кто-то захочет сделать это с трубкой.

test %>% 
    select(sort(names(.)))

4
Для меня это сработало хорошо, так как сначала легко выбрать нужные мне переменные. Придерживаясь оригинального df: он test%>%select(b,sort(names(.)))будет
выглядеть

@Silentdevildoll классное приложение! Я не думал об этом.
Эндрю Бреза 01

14
test = data.frame(C=c(0,2,4, 7, 8), A=c(4,2,4, 7, 8), B=c(1, 3, 8,3,2))

Можно выполнить замену следующей простой функции (но только если во фрейме данных не так много столбцов):

test <- test[, c("A", "B", "C")]

для других:

test <- test[, c("B", "A", "C")]



2

Итак, чтобы сначала был конкретный столбец, а затем остальные в алфавитном порядке, я бы предложил следующее решение:

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]

и если вы хотите, чтобы вначале было несколько столбцов, что тогда?
Максим Мороз

2

Альтернативный вариант - использовать строкуstr_sort() из библиотеки с аргументом . Это позволит правильно упорядочить столбцы, которые включают числа не только в алфавитном порядке :numeric = TRUE

str_sort(c("V3", "V1", "V10"), numeric = TRUE)

# [1] V1 V3 V11


1

Подобен другому синтаксису выше, но для обучения - можно ли сортировать по именам столбцов?

sort(colnames(test[1:ncol(test)] ))

Здесь [1:ncol(test)]ничего не делается, это просто более длинный способ писать sort(colnames(test)).
Грегор Томас

0

Вот что я обнаружил, чтобы достичь аналогичной проблемы с моим набором данных.

Во-первых, сделайте то, что Джеймс упомянул выше, т.е.

test[ , order(names(test))]

Во-вторых, используйте функцию all () в dplyr для перемещения определенных интересующих столбцов (например, «D», «G», «K») в начало фрейма данных, помещая столбцы в алфавитном порядке после этих.

select(test, D, G, K, everything())

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.