2011-10-11 18 views
7

मुझे एक ऐसा एप्लिकेशन सामने आया है जहां मुझे कॉलम संख्याओं द्वारा डेटा.फ्रेम सॉर्ट करने की आवश्यकता है, और usual solutions में से कोई भी इसकी अनुमति नहीं देता है।किसी सूची पर आदेश

संदर्भ as.data.frame.by विधि बना रहा है। चूंकि by ऑब्जेक्ट का मूल्य कॉलम और इंडेक्स कॉलम के रूप में पहला एनकॉल -1 कॉलम के रूप में अपना अंतिम कॉलम होगा। melt इसे पीछे की ओर लौटाता है - इंडेक्स 3, फिर इंडेक्स 2, फिर इंडेक्स 1. latex.table.by के साथ संगतता के लिए मैं इसे आगे क्रमबद्ध करना चाहता हूं। लेकिन मुझे पर्याप्त सामान्य तरीके से ऐसा करने में परेशानी हो रही है। नीचे दिए गए फ़ंक्शन में टिप्पणी-आउट लाइन अब तक का सबसे अच्छा प्रयास है।

as.data.frame.by <- function(x, colnames=paste("IDX",seq(length(dim(x))),sep=""), ...) { 
    num.by.vars <- length(dim(x)) 
    res <- melt(unclass(x)) 
    res <- na.omit(res) 
    colnames(res)[seq(num.by.vars)] <- colnames 
    #res <- res[ order(res[ , seq(num.by.vars)]) , ] # Sort the results by the by vars in the heirarchy given 
    res 
} 

dat <- transform(ChickWeight, Time=cut(Time,3), Chick=cut(as.numeric(Chick),3)) 
my.by <- by(dat, with(dat,list(Time,Chick,Diet)), function(x) sum(x$weight)) 
> as.data.frame(my.by) 
      IDX1   IDX2 IDX3 value 
1 (-0.021,6.99] (0.951,17.3] 1 3475 
2  (6.99,14] (0.951,17.3] 1 5969 
3  (14,21] (0.951,17.3] 1 8002 
4 (-0.021,6.99] (17.3,33.7] 1 640 
5  (6.99,14] (17.3,33.7] 1 1596 
6  (14,21] (17.3,33.7] 1 2900 
13 (-0.021,6.99] (17.3,33.7] 2 2253 
14  (6.99,14] (17.3,33.7] 2 4734 
15  (14,21] (17.3,33.7] 2 7727 
22 (-0.021,6.99] (17.3,33.7] 3 666 
23  (6.99,14] (17.3,33.7] 3 1391 
24  (14,21] (17.3,33.7] 3 2109 
25 (-0.021,6.99] (33.7,50] 3 1647 
26  (6.99,14] (33.7,50] 3 3853 
27  (14,21] (33.7,50] 3 7488 
34 (-0.021,6.99] (33.7,50] 4 2412 
35  (6.99,14] (33.7,50] 4 5448 
36  (14,21] (33.7,50] 4 8101 

लाइन uncommented के साथ, यह निरर्थक शब्द देता है (यह सिर्फ एक वेक्टर के रूप में पूरे data.frame व्यवहार करता है विनाशकारी परिणाम के साथ)।

मैंने चालाक सामान भी res <- res[ order(...=list(res[,1],res[,2])) , ] की कोशिश की है लेकिन इसका कोई फायदा नहीं हुआ है।

मुझे संदेह है कि ऐसा करने का एक आसान तरीका है, लेकिन मैं इसे नहीं देख रहा हूं।

स्पष्टीकरण के लिए संपादित करें: मैं कॉलम नाम निर्दिष्ट नहीं करना चाहता हूं। इसके बजाय, मैं इसे संख्यात्मक वेक्टर द्वारा सॉर्ट करने में सक्षम होना चाहता हूं (उदा। कॉलम 1: 4 द्वारा क्रमबद्ध करें)।

उत्तर

7
mydf <- as.data.frame(my.by) 
mydf[order(mydf$IDX3, mydf$IDX2, mydf$IDX1) , ] 
      IDX1   IDX2 IDX3 value 
1 (-0.021,6.99] (0.951,17.3] 1 3475 
3  (14,21] (0.951,17.3] 1 8002 
2  (6.99,14] (0.951,17.3] 1 5969 
4 (-0.021,6.99] (17.3,33.7] 1 640 
6  (14,21] (17.3,33.7] 1 2900 
5  (6.99,14] (17.3,33.7] 1 1596 
13 (-0.021,6.99] (17.3,33.7] 2 2253 
15  (14,21] (17.3,33.7] 2 7727 
14  (6.99,14] (17.3,33.7] 2 4734 
22 (-0.021,6.99] (17.3,33.7] 3 666 
24  (14,21] (17.3,33.7] 3 2109 
23  (6.99,14] (17.3,33.7] 3 1391 
25 (-0.021,6.99] (33.7,50] 3 1647 
27  (14,21] (33.7,50] 3 7488 
26  (6.99,14] (33.7,50] 3 3853 
34 (-0.021,6.99] (33.7,50] 4 2412 
36  (14,21] (33.7,50] 4 8101 
35  (6.99,14] (33.7,50] 4 5448 

या;

my.by <- by(dat, with(dat,list(Diet,Chick, Time)), function(x) sum(x$weight)) 
mydf <- as.data.frame(my.by) 

संपादित करें:

mydf <- as.data.frame(my.by) 
mydf[ do.call(order, mydf[, 3:1]) , ] 
+0

क्षमा स्पष्ट किया जाना चाहिए था: मैं स्तंभ नाम निर्दिष्ट करने के लिए नहीं करना चाहते हैं या यह संख्यात्मक कॉलम सूचकांकों का उपयोग कर ऊपर के रूप में ही उत्पादन पैदा करता है। इसके बजाय, मैं इसे संख्यात्मक वेक्टर द्वारा सॉर्ट करने में सक्षम होना चाहता हूं (उदा। कॉलम 1: 4 द्वारा क्रमबद्ध करें)। –

+0

ऊपर देखें। 'ऑर्डर' पर डेटा फ्रेम को पास करने की do.call विधि 'सहायता (ऑर्डर)' पृष्ठ पर सचित्र है। –

+0

अच्छा। धन्यवाद। मुझे 'do.call' में अधिक बारीकी से देखने की ज़रूरत है, क्योंकि मुझे संदेह है कि यह मेरी कई समस्याओं का समाधान करेगा :-) –

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