2010-10-21 25 views
6

मैं समझने की कोशिश कर रहा हूं कि एक से अधिक डेटा पर आधारित एक डेटा। फ्रेम को कैसे क्रमबद्ध करें। यह प्रश्न does this with vectors। क्या कोई डेटा.फ्रेम के बराबर करने का तरीका सुझा सकता है?आर: अन्य कॉलम द्वारा कई कॉलम सॉर्ट करें। फ्रेम?

यहां कुछ नमूना डेटा है।

x1 <- data.frame(a=1:5, b=letters[1:5], c=rnorm(5)) 
x2 <- data.frame(a=c(4,4,2), b=c("d", "d", "b"), d=rnorm(3)) 

तो मैं x1 के पहले दो स्तंभों द्वारा x2 को सॉर्ट करना चाहता हूं। मेरे वास्तविक डेटा और अधिक जटिल है, लेकिन इस विचार को दोहराता है ...

उत्तर

9

यह वास्तव में इस बात पर निर्भर करता है कि आपका डेटा वास्तव में कैसा दिखता है। के रूप में यह अभी लग रहा है, आप केवल सुलझाने के लिए एक स्तंभ की जरूरत है, और है कि आसानी से द्वारा किया जाता है:

x2[order(match(x2[,1],x1[,1])),] 

आप एक से अधिक स्तंभ की जरूरत है, इस थोड़ा जटिल काम बन जाता है। आप जो एक आप पहली बार पर क्रमबद्ध करना चाहते हैं निर्दिष्ट करने के लिए है, और होगा जो एक दूसरे, जैसे:

x1 <- data.frame(a=rep(1:3,2), b=rep(letters[2:4],each=2), c=rnorm(6)) 
x2 <- data.frame(a=c(3,3,2), b=c("c", "d", "b"), d=rnorm(3)) 


x2[order(match(
    paste(x2[,1],x2[,2]), 
    paste(x1[,1],x1[,2])) 
),] 

यह पहला प्रथम स्तंभ पर क्रमबद्ध करता है, और फिर दूसरे पर। आपको यह ध्यान रखना होगा कि x1 में x2 में भी सभी संयोजनों की आवश्यकता है। टी

2

x1 की प्रासंगिक कॉलम को एक रैंक स्तंभ संलग्न करें:

len <- dim(x1)[1] 
x1. <- cbind(x1[,1:2], rank=1:len) 

x2 में मर्ज (यह एक एसक्यूएल की तरह है में शामिल होने के; देखना

x2. <- merge(x2, x1.) 

क्रमबद्ध करें::

x2.[order(x2.[,'rank']),] 
कैसे क्या होता है अगर वहाँ इस तरह के कई मैचों या कोई मेल नहीं) के रूप में अस्पष्टता निर्दिष्ट करने के लिए मर्ज प्रलेखन
1

यह plyr का उपयोग कर ठीक से किया जा सकता है। जोरिस 'जवाब काफी अच्छी तरह से काम करेगा, लेकिन संभावित missort सकता है जब तार के संयोजन:

x1 <- data.frame(a=rep(1:3,2), b=rep(letters[2:4],each=2), c=rnorm(6)) 
x2 <- data.frame(a=c(3,3,2), b=c("c", "d", "b"), d=rnorm(3)) 

library(plyr) 
keys<-join.keys(x1,x2,c("a","b")) 
matches<-match(keys$y,keys$x,nomatch=(keys$n+1)) 
x2[order(matches),] 

यह सबसे किनारे मामलों को संभाल चाहिए, बेमेल सूची:

> paste ("A A","B") 
[1] "A A B" 
> paste ("A","A B") 
[1] "A A B" 

आप join.keys और match का उपयोग कर एक सटीक जवाब प्राप्त कर सकते हैं आकार, इत्यादि। इंडेक्स कॉलम दोनों में एक मैच के बिना आइटम सूची के अंत में रखे जाते हैं।

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