จัดเรียงคอลัมน์ของดาต้าเฟรมตามชื่อคอลัมน์


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

โปรดทราบว่าชุดข้อมูลของฉันมีขนาดใหญ่โดยมีตัวแปร 10,000 รายการ ดังนั้นกระบวนการจะต้องเป็นแบบอัตโนมัติมากขึ้น

คำตอบ:


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]
John Clark

มีวิธีจัดเรียงคอลัมน์ตามที่ฉันต้องการหรือไม่ (พูดว่า CAB)
TYZ

คุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่า data.frame คือรายการและทำให้ง่ายขึ้น :: test[ order(names(test)) ]
ctbrown

1
@naco ไม่มีอ่านที่มาของcolnames: มันลงเอยด้วยการเรียกร้องnamesให้data.frame.
เจมส์

27

นี่คือdplyrคำตอบที่จำเป็นในกรณีที่มีคนต้องการทำเช่นนี้กับท่อ

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

4
สำหรับฉันสิ่งนี้ทำงานได้ดีเนื่องจากง่ายต่อการเลือกตัวแปรที่ฉันต้องการก่อน ยึดติดกับ df เดิม: test%>%select(b,sort(names(.)))จะใส่เป็น "b, a, c"
Silentdevildoll

@Silentdevildoll เป็นแอปพลิเคชั่นสุดเจ๋ง! ฉันไม่ได้คิดถึงเรื่องนั้น
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))

การใช้การแทนที่ฟังก์ชันง่ายๆต่อไปนี้สามารถทำได้ (แต่เฉพาะในกรณีที่ data frame ไม่มีหลายคอลัมน์):

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

และถ้าคุณต้องการให้มีคอลัมน์มากกว่าหนึ่งคอลัมน์ขึ้นไปก่อนล่ะ?
Maksym Moroz

2

ตัวเลือกทางเลือกคือการใช้str_sort()จากห้องสมุดstringrnumeric = 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))
Gregor Thomas

0

นี่คือสิ่งที่ฉันค้นพบเพื่อให้เกิดปัญหาที่คล้ายกันกับชุดข้อมูลของฉัน

ก่อนอื่นให้ทำในสิ่งที่ยากอบกล่าวไว้ข้างต้นนั่นคือ

test[ , order(names(test))]

ประการที่สองใช้ฟังก์ชัน everything () ใน dplyr เพื่อย้ายคอลัมน์เฉพาะที่สนใจ (เช่น "D", "G", "K") ที่จุดเริ่มต้นของ data frame โดยวางคอลัมน์ที่เรียงตามลำดับตัวอักษรไว้หลังคอลัมน์เหล่านั้น

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.