2012-05-14 12 views
5

मैं मिलान ऑपरेटरों का उपयोग एक अलग डेटा फ्रेम से मैट्रिक्स में दिखाई देने वाले मानों को पकड़ने के लिए कर रहा हूं। हालांकि, परिणामस्वरूप मैट्रिक्स में डेटा फ्रेम में दिखाई देने वाले क्रम में मान होते हैं, न कि मूल मैट्रिक्स में। मिलान ऑपरेटर का उपयोग कर मूल मैट्रिक्स के क्रम को संरक्षित करने का कोई तरीका है?आर - मिलान ऑपरेटरों (% में%) का उपयोग करते समय ऑर्डर को सुरक्षित रखें

vec=c("b","a","c"); vec 

df=data.frame(row.names=letters[1:5],values=1:5); df 

df[rownames(df) %in% vec,1] 

यह > [1] 1 2 3 जो आदेश डेटा फ्रेम में "a" "b" "c" प्रकट होता है पैदा करता है:

यहां एक त्वरित उदाहरण है। हालांकि, मैं >[1] 2 1 3 उत्पन्न करना चाहता हूं जो मूल वेक्टर में दिखाई देने वाला क्रम है।

धन्यवाद!

उत्तर

6

उपयोग match

df[match(vec, rownames(df)), ] 
# [1] 2 1 3 

ध्यान रखें कि यदि आप या तो vec या rownames(df) में डुप्लिकेट मानों है, match अपेक्षा के अनुरूप व्यवहार नहीं हो सकता है।

संपादित करें: मैं सिर्फ महसूस किया कि पंक्ति नाम अनुक्रमण में थोड़ा और अधिक बस और सुंदर ढंग से आपकी समस्या का समाधान होगा:

df[vec, ] 
# [1] 2 1 3 
+0

बोनस अंक फ़िल्टर करने के लिए कॉल की आवश्यकता को हटा सकते हैं, लेकिन दोनों समाधान काम करते हैं। धन्यवाद! – jslefche

3

उपयोग match (और एनए से छुटकारा पाने के लिए उन है कि अन्य में मेल न खाने वाले या तो वेक्टर में तत्वों के लिए मान):

Filter(function(x) !is.na(x), match(rownames(df), vec)) 
+1

असल में, यदि आप nomatch = 0 के साथ मेल खाते हैं, तो मेल से मेल खाने वाली वस्तुओं के लिए एनए की बजाय 0 वापस आ जाएगा। चूंकि पंक्ति का चयन [] केवल 0s को अनदेखा करता है, इसलिए आप मैच परिणाम निर्देशिका को [] में स्पर्श कर सकते हैं, पंक्ति नाम अनुक्रमण का उपयोग करने के लिए – frankc

0

के बाद से पंक्ति नाम अनुक्रमण भी वैक्टर पर काम करता है, हम इस एक कदम आगे ले जा सकते हैं और निर्धारित करें:

df[rownames(df) %ino% vec, 1] 
[1] 2 1 3 
:

'%ino%' <- function(x, table) { 
    xSeq <- seq(along = x) 
    names(xSeq) <- x 
    Out <- xSeq[as.character(table)] 
    Out[!is.na(Out)] 
} 

अब हम वांछित परिणाम है

समारोह के अंदर, नाम() एक ऑटो चरित्र और तालिका में कनवर्ट करता as.character() के साथ बदल गया है, तो यह भी सही ढंग से काम करता है जब आदानों की% ino% नंबर दिए गए हैं:

LETTERS[1:26 %in% 4:1] 
[1] "A" "B" "C" "D" 


LETTERS[1:26 %ino% 4:1] 
[1] "D" "C" "B" "A" 

के बाद % में%, लापता मान निकाल दिए:

data.frame(letters, LETTERS)[1:5 %in% 3:-5,] 

    letters LETTERS 
1  a  A 
2  b  B 
3  c  C 
6  f  F 
7  g  G 
8  h  H 
11  k  K 
12  l  L 
13  m  M 
16  p  P 
17  q  Q 
18  r  R 
21  u  U 
22  v  V 
23  w  W 
26  z  Z 


data.frame(letters, LETTERS)[1:5 %ino% 3:-5,] 

    letters LETTERS 
3  c  C 
2  b  B 
1  a  A 
:

LETTERS[1:26 %in% 3:-5] 
[1] "A" "B" "C" 

LETTERS[1:26 %ino% 3:-5] 
[1] "C" "B" "A" 

% में% के साथ तार्किक अनुक्रम वस्तु के आयाम में दोहराया है subsetted जा रहा है, इस% ino% के साथ ऐसा नहीं है

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