2012-10-09 13 views
8

मैं एक निम्न डेटा फ्रेममेरी dataframe ऑर्डर करने के लिए कैसे lexicographicaly

a = data.frame(a=c(1,2,3,4,5,6,7),b=c(1,2,3,10,12,21,4),c=c(1,2,10,11,"X","Y",3)) 
> a 
    a b c 
1 1 1 1 
2 2 2 2 
3 3 3 10 
4 4 10 11 
5 5 12 X 
6 6 21 Y 
7 7 4 3 

मैं lexicographical क्रम में पूरे डेटा फ्रेम सॉर्ट करने के लिए है, ताकि उत्पादन (उदाहरण के लिए, स्तंभ "सी")

की तरह होना चाहिए चाहते हैं
> a[,"c"] 
[1] 1 2 3 10 11 X Y 

मैंने कोशिश की और मैं अलग जवाब

indata <- a[do.call(order,a[,c("c","a","b")]),] 
> indata[,"c"] 
[1] 1 10 11 2 3 X Y 
Levels: 1 10 11 2 3 X Y 

मैं gtools की कोशिश की, mixedorder पैकेज एक geting हूँ nd एक स्तंभ पर ठीक काम किया:

> a[mixedorder(a$c),] 
    a b c 
1 1 1 1 
2 2 2 2 
3 3 3 10 
4 4 10 11 
5 5 12 X 
6 6 21 Y 
7 7 4 3 

लेकिन यह अगर मैं एकाधिक स्तंभों में शामिल हैं काम नहीं करता:

> a[with(a,order(mixedorder(c),mixedorder(b),mixedorder(a))),] 
    a b c 
1 1 1 1 
2 2 2 2 
4 4 10 11 
5 5 12 X 
6 6 21 Y 
7 7 4 3 
3 3 3 10 

हालांकि मैं उम्मीद कर रहा हूँ:

a b c 
1 1 1 1 
2 2 2 2 
4 7 4 3 
5 3 3 10 
6 4 10 11 
7 5 12 X 
3 6 21 Y 
+0

आपको और अधिक स्पष्ट होना होगा। क्या आप स्तंभ 'सी', या कॉलम 'c' के संबंध में संपूर्ण डेटा फ्रेम को सॉर्ट करना चाहते हैं? – joran

+0

मैं सी के संबंध में पूरे डेटा फ्रेम को सॉर्ट करना चाहता हूं। मैंने आसान समझने के लिए एक [, "सी"] दिया – user1631306

उत्तर

7

एक विकल्प का उपयोग करने के लिए है gtools पैकेज से।

library(gtools) 
a[mixedorder(a$c),] 
# a b c 
# 1 1 1 1 
# 2 2 2 2 
# 7 7 4 3 
# 3 3 3 10 
# 4 4 10 11 
# 5 5 12 X 
# 6 6 21 Y 
+1

सॉर्टिंग के लिए मैं एकाधिक स्तंभों का एक साथ उपयोग कैसे करूं (पहले सी, फिर बी और फिर ए)? – user1631306

+1

@ user1631306 ** plyr ** पैकेज में 'व्यवस्था करें' का प्रयास करें। – joran

+2

@ user1631306 - उस स्थिति में, आप यह कर सकते हैं: 'a [with (a, ऑर्डर (मिश्रित (सी), बी, ए)),]'। –

4

आधार में चिपका आप एक समारोह अपने आप को बना सकता है:

a = data.frame(a=c(1,2,3,4,5,6,7),b=c(1,2,3,10,12,21,4),c=c(1,2,10,11,"X","Y",3)) 

SORTER_DEVICE <- function(x) { 
    c(sort(as.numeric(na.omit(gsub("[a-zA-Z]", NA, x)))), 
     sort(na.omit(gsub("[0-9]", NA, x)))) 
} 
data.frame(apply(a, 2, SORTER_DEVICE)) 
1

दुर्भाग्य mixedsort (अभी तक) एकाधिक स्तंभ छंटाई का समर्थन करता है। इसलिए, जब आप यह अपने आप को लागू करने, उदाहरण के लिए इस तरह की जरूरत है:

a[order(sub("[0-9]+", "", a$c), 
     as.numeric(sub("[[:alpha:]]*([[:digit:]]*)", '\\1', a$c)), 
     as.numeric(a$b), 
     as.numeric(a$a)), ] 

यह पहली, alphanumerically सॉर्ट करता data.frame एक $ ग का उपयोग कर, और टाई स्थितियों के लिए (जो वास्तव में अपने data.frame में मौजूद नहीं है ' ए '), यह $ बी और एक $ ए का उपयोग करता है।

आउटपुट है:

a b c 
1 1 1 1 
2 2 2 2 
7 7 4 3 
3 3 3 10 
4 4 10 11 
5 5 12 X 
6 6 21 Y 

पुनश्च: यह एक ऐसी ही सवाल का जवाब देने के रूप में this post में डेविड Winsemius द्वारा लिखा गया था।

संबंधित मुद्दे