Сортування стовпців фрейму даних за назвою стовпця


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

Для власного визначеного замовлення вам потрібно буде визначити своє власне відображення імен до замовлення. Це залежатиме від того, як ви хочете це зробити, але обмін будь-якою функцією на це з orderвищезгаданим має дати бажаний результат.

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


3
Для детального випробування тест [, c (2,3,1)] або тест [, c ('A', 'B', 'C')] створить порядок стовпців A, B, C. Оператор "[" дуже розумно з’ясовує, що ви хочете зробити.
Carl Witthoft,

2
дякую, я розібрався з другим запитанням за допомогою; myorder = c ("B", "A", "C"), test [, myorder]
Джон Кларк

Чи є спосіб сортувати стовпці так, як я хочу (скажімо, САВ)?
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 це класний додаток! Я про це не думав.
Ендрю Бреза,

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


4

Якщо вам потрібна лише одна або декілька колонок спереду, і ви не дбаєте про порядок решти:

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

2

Отже, щоб конкретний стовпець стояв першим, а потім решта за алфавітом, я запропонував би таке рішення:

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

і якщо ви хочете, щоб першим було більше одного стовпця, то що?
Максим Мороз

2

Альтернативний варіант - використання str_sort()з бібліотеки stringr з аргументом 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))]

По-друге, використовуйте функцію everything () у dplyr для переміщення певних стовпців, що цікавлять (наприклад, "D", "G", "K") на початку кадру даних, ставлячи алфавітно впорядковані стовпці після цих.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.