स्तंभ नाम से डेटाफ्रेम के स्तंभों को सॉर्ट करें


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, और का उपयोग करें कि कॉलम जब subsetting ऑर्डर करने के लिए:

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
विस्तृत करने के लिए, परीक्षण [, सी (2,3,1)] या परीक्षण [, सी ('ए', 'बी', 'सी')] ए, बी, सी स्तंभ क्रम का उत्पादन करेगा। "[" ऑपरेटर यह पता लगाने में बहुत चतुर है कि आप क्या करना चाहते हैं।
कार्ल विटथॉफ्ट

2
धन्यवाद, मैंने मदद के साथ दूसरा प्रश्न निकाला; myorder = c ("B", "A", "C"), परीक्षण [, myorder]
जॉन क्लार्क

क्या एक तरह से कॉलम को मैं चाहता हूं (सीएबी) कहूं?
TYZ

आप इस तथ्य का लाभ उठा सकते हैं कि डेटा.फ्रेम एक सूची है और इसे सरल बना देता है :: test[ order(names(test)) ]
ctbrown

1
@ नाको कोई नहीं, इसका स्रोत पढ़ें colnames: यह कॉलिंग namesए के लिए समाप्त होता है data.frame
जेम्स

27

dplyrयदि कोई व्यक्ति पाइप के साथ ऐसा करना चाहता है, तो यहां अनिवार्य जवाब है।

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

4
मेरे लिए यह अच्छी तरह से काम किया है क्योंकि यह उन चरों का चयन करना आसान है जिन्हें मैं पहले चाहता हूं। मूल df से चिपके हुए: test%>%select(b,sort(names(.)))इसे "b, a, c" के रूप में रखा जाएगा
Silentdevildolloll

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



2

तो एक विशिष्ट कॉलम पहले आना है, फिर बाकी वर्णानुक्रम में, मैं इस समाधान का प्रस्ताव करूंगा:

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

और यदि आप एक से अधिक कॉलम पहले चाहते हैं, तो क्या?
मैक्सिमम मोरोज़

2

एक वैकल्पिक विकल्प तर्क के साथ str_sort()पुस्तकालय स्ट्रिंग से उपयोग करना है 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))]

दूसरा, ब्याज की विशिष्ट कॉलम (जैसे, "D", "G", "K") को स्थानांतरित करने के लिए dplyr में सब कुछ () फ़ंक्शन का उपयोग करें, डेटा फ्रेम की शुरुआत में, उन लोगों के बाद वर्णानुक्रम से ऑर्डर किए गए कॉलम डालते हैं।

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.