मुझे एक ऐसा एप्लिकेशन सामने आया है जहां मुझे कॉलम संख्याओं द्वारा डेटा.फ्रेम सॉर्ट करने की आवश्यकता है, और 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 द्वारा क्रमबद्ध करें)।
क्षमा स्पष्ट किया जाना चाहिए था: मैं स्तंभ नाम निर्दिष्ट करने के लिए नहीं करना चाहते हैं या यह संख्यात्मक कॉलम सूचकांकों का उपयोग कर ऊपर के रूप में ही उत्पादन पैदा करता है। इसके बजाय, मैं इसे संख्यात्मक वेक्टर द्वारा सॉर्ट करने में सक्षम होना चाहता हूं (उदा। कॉलम 1: 4 द्वारा क्रमबद्ध करें)। –
ऊपर देखें। 'ऑर्डर' पर डेटा फ्रेम को पास करने की do.call विधि 'सहायता (ऑर्डर)' पृष्ठ पर सचित्र है। –
अच्छा। धन्यवाद। मुझे 'do.call' में अधिक बारीकी से देखने की ज़रूरत है, क्योंकि मुझे संदेह है कि यह मेरी कई समस्याओं का समाधान करेगा :-) –