Сортировать столбцы данных по имени столбца - PullRequest
71 голосов
/ 07 сентября 2011

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

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 переменными. Таким образом, процесс должен быть более автоматизированным.

Ответы [ 9 ]

110 голосов
/ 07 сентября 2011

Вы можете использовать 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

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

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

13 голосов
/ 02 апреля 2014
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")]
11 голосов
/ 16 августа 2018

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

test %>% 
    select(sort(names(.)))
4 голосов
/ 18 ноября 2017
  test[,sort(names(test))]

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

2 голосов
/ 27 октября 2018

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

require(dplyr)
test %>%
  select(B, everything())
0 голосов
/ 28 июня 2019

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

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]
0 голосов
/ 19 мая 2019

Еще один вариант - использовать str_sort() из библиотеки stringr с аргументом numeric = TRUE

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

# [1] V1 V3 V11

0 голосов
/ 15 марта 2019

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

sort(colnames(test[1:ncol(test)] ))
0 голосов
/ 25 июля 2017

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

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

test[ , order(names(test))]

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...