2016-02-08 5 views
15

क्या निम्नलिखित dplyr कोड ?:dplyr अवधि चरित्र "।" क्या करता है संदर्भ?

(df <- as.data.frame(matrix(rep(1:5, 5), ncol=5))) 
# V1 V2 V3 V4 V5 
# 1 1 1 1 1 1 
# 2 2 2 2 2 2 
# 3 3 3 3 3 3 
# 4 4 4 4 4 4 
# 5 5 5 5 5 5 

dplyr::mutate_each(df, funs(. == 5)) 
#  V1 V2 V3 V4 V5 
# 1 FALSE FALSE FALSE FALSE FALSE 
# 2 FALSE FALSE FALSE FALSE FALSE 
# 3 FALSE FALSE FALSE FALSE FALSE 
# 4 FALSE FALSE FALSE FALSE FALSE 
# 5 TRUE TRUE TRUE TRUE TRUE 

में अवधि . संदर्भ "सभी कॉलम" के लिए इस आशुलिपि है करता है? क्या यह . विशिष्ट dplyr वाक्यविन्यास है या यह सामान्य आर वाक्यविन्यास है (जैसा कि here पर चर्चा की गई है)?

इसके अलावा, निम्न कोड का परिणाम क्यों त्रुटि में है?

dplyr::filter(df, . == 5) 
# Error: object '.' not found 

उत्तर

13

डॉट का उपयोग मुख्य रूप से (विशेष रूप से नहीं) mutate_each, summarise_each और do में dplyr के भीतर किया जाता है। पहले दो (और उनके एसई समकक्ष) में यह उन सभी कॉलमों को संदर्भित करता है जिनके कार्यों में funs लागू होते हैं। do में यह (संभावित रूप से समूहित) डेटा.फ्रेम को संदर्भित करता है ताकि आप "xyz" नामक कॉलम को संदर्भित करने के लिए .$xyz का उपयोग कर एकल कॉलम का संदर्भ दे सकें।

कारणों से आप

filter(df, . == 5) 

नहीं चलाया जा सकता है, क्योंकि एक) filter उदाहरण के लिए mutate_each और ख) आप magrittr से पाइप ऑपरेटर %>% (मूल रूप से उपयोग करने के लिए की आवश्यकता होगी की तरह एकाधिक स्तंभों के साथ काम करने के लिए डिजाइन नहीं है) ।

हालांकि, आप इसे rowSumsfilter अंदर की तरह एक समारोह के साथ इस्तेमाल कर सकते हैं जब पाइप ऑपरेटर %>% के साथ संयुक्त:

> filter(mtcars, rowSums(. > 5) > 4) 
Error: Objekt '.' not found 

> mtcars %>% filter(rowSums(. > 5) > 4) %>% head() 
    lm cyl disp hp drat wt qsec vs am gear carb 
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
3 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
4 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
5 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 
6 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4 

तुम भी magrittr मदद फ़ाइलों पर एक नज़र रखना चाहिए:

library(magrittr) 
help("%>%") 

सहायता पृष्ठ से:

rhs में कहीं और lhs को कॉल करें अक्सर आप पहली बार की तुलना में rhs को rhs को कॉल करना चाहते हैं। इस उद्देश्य के लिए आप डॉट (।) को प्लेसहोल्डर के रूप में उपयोग कर सकते हैं। उदाहरण के लिए, y %>% f(x, .)f(x, y) के बराबर है और z %>% f(x, y, arg = .)f(x, y, arg = z) के बराबर है।

माध्यमिक प्रयोजनों के लिए डॉट का प्रयोग अक्सर, कुछ विशेषता या एलएचएस आरएचएस में वांछित है की संपत्ति एलएचएस ही है, जैसे की मूल्य के अलावा फोन पंक्तियों या स्तंभों की संख्या। यह rhs कॉल में कई बार डॉट प्लेसहोल्डर का उपयोग करने के लिए पूरी तरह से मान्य है, लेकिन डिज़ाइन द्वारा नेस्टेड फ़ंक्शन कॉल के अंदर इसका उपयोग करते समय व्यवहार थोड़ा अलग होता है। विशेष रूप से, यदि प्लेसहोल्डर का उपयोग केवल नेस्टेड फ़ंक्शन कॉल में किया जाता है, तो lhs को पहले तर्क के रूप में भी रखा जाएगा! इसका कारण यह है कि अधिकांश उपयोग-मामलों में यह सबसे अधिक पठनीय कोड उत्पन्न करता है। उदाहरण के लिए, iris %>% subset(1:nrow(.) %% 2 == 0) iris %>% subset(., 1:nrow(.) %% 2 == 0) के बराबर है लेकिन थोड़ा अधिक कॉम्पैक्ट है। ब्रेसिज़ में rhs संलग्न करके इस व्यवहार को खत्म करना संभव है। उदाहरण के लिए, 1:10 %>% {c(min(.), max(.))} c(min(1:10), max(1:10)) के बराबर है।

5

डॉट का funs के भीतर एक विशेष अर्थ है। उस संदर्भ में यह डमी पैरामीटर को संदर्भित करता है। एक अवरोध के लिए ?funs देखें।

funs"fun_list" क्लास ऑब्जेक्ट बनाता है जो कार्यों की एक सूची का प्रतिनिधित्व करता है। funs का प्रत्येक तर्क एक फ़ंक्शन नाम है, फ़ंक्शन स्ट्रिंग फ़ंक्शन नाम या फ़ंक्शन के बॉडी का प्रतिनिधित्व करने वाली अभिव्यक्ति का प्रतिनिधित्व करता है। अंतिम मामले में, फ़ंक्शन बॉडी का प्रतिनिधित्व करने वाली अभिव्यक्ति के भीतर, फ़ंक्शन का तर्क डॉट द्वारा दर्शाया जाता है ताकि . == 5 फ़ंक्शन function(.) . == 5 (हालांकि dplyr वास्तव में उस फ़ंक्शन का निर्माण नहीं करता है बल्कि इसके बजाय "fun_list" ऑब्जेक्ट का उपयोग करता है)।

इस उदाहरण में, mutate_each प्रत्येक कॉलम के लिए एक बार फ़ंक्शन चलाएगा ताकि यह प्रश्न के समान ही हो, सिवाय इसके कि प्रत्येक बार निर्मित फ़ंक्शन (यह वास्तव में निर्मित नहीं होता है लेकिन हम सोच सकते हैं इसके बारे में इस तरह से) कहा जाता है:

> out <- mutate_each(df, funs({print(.); . == 5})) 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 
[1] 1 2 3 4 5 

अपने filter उदाहरण में, funs इस्तेमाल नहीं किया जा रहा है और filter वैसे भी "fun_list" वस्तुओं के साथ काम नहीं करता।

डॉट के अन्य संदर्भों में dplyr के भीतर अन्य अर्थ हैं और अन्य संकुलों के लिए अन्य संदर्भों के साथ अन्य अर्थ भी हो सकते हैं।

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