2015-06-30 5 views
7

के व्यवहार पर एक स्पष्टीकरण निम्नलिखित बहुत सरल उदाहरण में मैं "==" ऑपरेटर के व्यवहार को समझ नहीं सकता।"==" ऑपरेटर

A <- c(10, 20, 10, 10, 20, 30) 
B <- c(40, 50, 60, 70, 80, 90) 

df <- data.frame(A, B) 

df[df$A == c(10,20), ]  # it returns 3 lines instead of 5 
df[df$A %in% c(10,20), ] # it works properly and returns 5 lines 

आप सभी को अग्रिम धन्यवाद।

+0

बहुत समान: [डेटा फ्रेम को सबसेट करने में अप्रत्याशित आउटपुट का कारण] (http://stackoverflow.com/questions/23145736/reason-for-unexpected-output-in-subsetting-data-frame-r/23145840) – thelatemail

उत्तर

10

यह समझने के लिए कि आपको क्या हो रहा है डेटा फ्रेम संरचना और रीसाइक्लिंग नियमों को समझना है। डेटा फ्रेम बस वैक्टर की एक सूची है।

> unclass(df) 
$A 
[1] 10 20 10 10 20 30 

$B 
[1] 50 60 50 40 70 80 

attr(,"row.names") 
[1] 1 2 3 4 5 6 

आप आर में विभिन्न अवधि की दो वैक्टर की तुलना में कम एक recycled है। आपके मामले में df$A == c(10,20) के बराबर है:

> c(10, 20, 10, 10, 20, 30) == c(10, 20, 10, 20, 10, 20) 
[1] TRUE TRUE TRUE FALSE FALSE FALSE 

और

> df[c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE), ] 
    A B 
1 10 50 
2 20 60 
3 10 50 

%in% documentation से:

%in% एक तार्किक वेक्टर लौटाता है यदि मिलान हो जाता है या नहीं अपनी बाईं के लिए यह दर्शाता है ऑपरेटिंग

> df$A %in% c(10,20) 
[1] TRUE TRUE TRUE TRUE TRUE FALSE 

और

> df[c(TRUE, TRUE, TRUE, TRUE, TRUE, FALSE), ] 
    A B 
1 10 50 
2 20 60 
3 10 50 
4 10 40 
5 20 70 
+0

मुझे रीसाइक्लिंग के बारे में यह नहीं पता था। धन्यवाद शून्य323। – Apostolos

3

यहाँ मेरी समाधान है कि मैं अन्य (बहुत अच्छा) उत्तर देने के लिए कुछ ऐसी जानकारियां दी जोड़ने आशा है।

जब दो वैक्टर के लिए एक ऑपरेशन है कि उन्हें आवश्यकता है एक ही लंबाई बनने के लिए आवेदन, अनुसंधान स्वचालित रूप से recycles, या दोहराता, छोटे से एक है, तक: में "आर प्रोग्रामिंग की कला" नोर्मैन मटलोफ द्वारा कहा गया है लंबे समय तक

से मिलान करने के लिए काफी लंबा है यदि अवधारणा अभी भी स्पष्ट नहीं है। क्योंकि यह बहुत "छोटा" वेक्टर recycles

[1] TRUE FALSE TRUE FALSE TRUE FALSE 

और ऐसा करके तो यह सही पर पहली 10 तुलना: इस पर एक नजर डालें और उत्पादन अनुमान लगाने का प्रयास:

c(10, 10, 10, 10, 10, 10) == c(10, 20) 

दे देंगे जो बाईं ओर पहली बार (और वह TRUE है) लेकिन 20 के साथ दूसरे दस की तुलना करता है (दाईं ओर वेक्टर का दूसरा तत्व) और यह FALSE है; उसके बाद आर छोटे वेक्टर (जो दाईं तरफ है) को फिर से चलाता है और गेम फिर से शुरू होता है।

+1

और वहां पाठकों के लिए यह पूछना कि यह संभवतः उपयोगी कैसे हो सकता है? दो उदाहरण: 1) सूची वेक्टर 'वेक्टर [सी (टी, एफ)] से अजीब संख्या वाले तत्वों को पकड़ें,' हर तीसरे तत्व 'वेक्टर [सी (एफ, एफ, टी)] को पकड़ें] 2) डेटा.फ्रेम/मैट्रिक्स जल्दी 'data.frame (वर्ग = "ए", मान = rnorm (100)) ' – Vlo

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