Veri çerçevesinin sütunlarını sütun adına göre sıralayın


93

Bu muhtemelen basit bir sorudur, ancak sütunların alfabetik olarak nasıl sıralanacağını bilmiyorum.

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

Sütunları alfabetik olarak sütun adlarına göre sıralamaktan hoşlanırım.

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

Diğerleri için kendi tanımlı siparişim istiyorum

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

Lütfen veri kümelerimin 10000 değişkenle çok büyük olduğunu unutmayın. Bu yüzden sürecin daha otomatik olması gerekiyor.

Yanıtlar:


137

Alt küme oluştururken sütunları sıralamak için, orderüzerinde kullanabilir ve bunu kullanabilirsiniz 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

Kendi tanımlı siparişiniz için, siparişle kendi isimlerinizin eşlemesini tanımlamanız gerekecektir. Bu, bunu nasıl yapmak istediğinize bağlı olacaktır, ancak bunun için herhangi bir işlevi orderyukarıdaki ile değiştirmek istediğiniz çıktıyı vermelidir.

Örneğin, bir veri çerçevesinin satırlarını istenen sırayı belirten bir hedef vektöre göre sıralayın , yani matchveri çerçevenizi namesistenen sütun sırasını içeren bir hedef vektöre karşı yapabilirsiniz .


3
Ayrıntılı olarak açıklamak gerekirse, test [, c (2,3,1)] veya test [, c ('A', 'B', 'C')] A, B, C sütun sırasını üretecektir. "[" Operatörü ne yapmak istediğinizi bulmakta çok zekidir.
Carl Witthoft

2
teşekkür ederim, sağlanan yardımla ikinci soruyu çözdüm; myorder = c ("B", "A", "C"), test [, kasıran]
John Clark

Sütunları istediğim şekilde sıralamanın bir yolu var mı (CAB diyelim)?
TYZ

Bir test[ order(names(test)) ]
data.frame'in

1
@naco Yok, kaynağını okuyun colnames: namesbir data.frame.
James

27

dplyrBirinin bunu boru ile yapmak istemesi durumunda zorunlu cevap burada.

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

4
Benim için bu iyi çalıştı çünkü önce istediğim değişkenleri seçmek kolay. Orijinal test%>%select(b,sort(names(.)))
df'ye bağlı kalarak

@Silentdevildoll bu harika bir uygulama! Ben bunu düşünmedim.
Andrew Brēza

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

Aşağıdaki basit işlev değişimi kullanılarak gerçekleştirilebilir (ancak yalnızca veri çerçevesi çok sütuna sahip değilse):

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

başkaları için:

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

6
  test[,sort(names(test))]

sütunların isimlerine göre sıralama kolaylıkla çalışabilir.


4

Önde yalnızca bir veya daha fazla sütun istiyorsanız ve diğerlerinin sırasını önemsemiyorsanız:

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

2

Öyleyse önce belirli bir sütunun, ardından alfabetik olarak geri kalanının gelmesi için şu çözümü öneririm:

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

ve birden fazla sütunun birinci olmasını istiyorsanız, o zaman ne olur?
Maksym Moroz

2

Alternatif bir seçenek, argümanla birlikte stringrstr_sort() kitaplığından kullanmaktır . Bu, yalnızca alfabetik olarak değil , sayıları içeren sütunu doğru şekilde sıralayacaktır :numeric = TRUE

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

# [1] V1 V3 V11


1

Yukarıdaki diğer sözdizimine benzer, ancak öğrenmek için - sütun adlarına göre sıralayabilir misiniz?

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

[1:ncol(test)]Yazmak için sadece daha uzun bir yol, burada hiçbir şey yapmıyor sort(colnames(test)).
Gregor Thomas

0

İşte veri setimle benzer bir problemi başarmak için bulduğum şey.

İlk olarak, James'in yukarıda bahsettiği şeyi yapın.

test[ , order(names(test))]

İkinci olarak, veri çerçevesinin başlangıcındaki belirli ilgi sütunlarını (örneğin, "D", "G", "K") taşımak için dplyr'deki everything () işlevini kullanın ve alfabetik sıralı sütunları bunlardan sonra koyun.

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.