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

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")]
МАНОДЖ КУМАР
источник
6
  test[,sort(names(test))]

сортировка по именам столбцов может работать легко.

Шалини Баранвал
источник
4

Если вам нужен только один или несколько столбцов впереди и вам не важен порядок остальных:

require(dplyr)
test %>%
  select(B, everything())
Ксавьер Хименес Альбан
источник
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)] ))
KNN
источник
Здесь [1:ncol(test)]ничего не делается, это просто более длинный способ писать sort(colnames(test)).
Грегор Томас
0

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

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

test[ , order(names(test))]

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

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

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

Брит
источник