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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

  test[,sort(names(test))]

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

Ответ 5

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

require(dplyr)
test %>%
  select(B, everything())

Ответ 6

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

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

test[ , order(names(test))]

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

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

Ответ 7

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

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

Ответ 8

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

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

# [1] V1 V3 V11

Ответ 9

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

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