2014-10-22 13 views
5

आर पैकेज 'dplyr' से फ़ंक्शन mutate कारकों के लिए एक असाधारण रीसाइक्लिंग सुविधा है, जिसमें ऐसा लगता है कि यह कारक as.numeric है। निम्न उदाहरण में y, आप क्या उम्मीद करेंगे हो जाता है, जबकि zc(1,1)dplyr में कारकों का अजीब रीसाइक्लिंग :: mutate - बग या सुविधा?

library(dplyr) 
df <- data_frame(x=1:2) 
glimpse(df %>% mutate(y="A", z=factor("B"))) 
# Variables: 
# $ x (int) 1, 2 
# $ y (chr) "A", "A" 
# $ z (int) 1, 1 

गया है, इस के पीछे किसी भी तर्क है, या यह एक बग है?

(मैं आर 3.1.1 और dplyr 0.3.0.1 उपयोग कर रहा हूँ।)


संपादित करें:

GitHub पर एक मुद्दे के रूप में इस पोस्ट करने के बाद, रोमेन फ्रेंकोइस यह घंटे के भीतर तय! इसलिए उपरोक्त अगर एक समस्या devtools::install_github का उपयोग कर रहा है नवीनतम संस्करण प्राप्त करने:

library(devtools) 
install_github("hadley/dplyr") 

और फिर

library(dplyr) 
df <- data_frame(x=1:2) 
glimpse(df %>% mutate(y="A", z=factor("B"))) 
# Variables: 
# $ x (int) 1, 2 
# $ y (chr) "A", "A" 
# $ z (fctr) B, B 

अच्छा काम रोमेन!

+0

यह व्यवहार वेक्टर रीसाइक्लिंग के कारण प्रतीत होता है। यदि आप लंबाई 2 का एक कारक निर्दिष्ट करते हैं, उदाहरण के लिए, 'झलक (डीएफ%>% उत्परिवर्तन (वाई = "ए", जेड = कारक (सी ("बी", "सी")))' ', चर' z' कारक वर्ग का होगा। –

+0

एक कारक चर प्राप्त करने का एक तरीका 'df%>% do (data.frame (।, Y =" ए ", z = factor (" B "), स्ट्रिंग्सएफ़ैक्टर्स = गलत) होगा ' – akrun

+0

@akrun' mutate 'सही विकल्प नहीं है? कोई अंदाजा? – jazzurro

उत्तर

12

dplyr वास्तविक mutate ऑपरेशन करने के लिए C++ का उपयोग करता है। Followingtherabbithole और यह नोट करना ungrouped mutation है, हम निम्नलिखित पर ध्यान देने के लिए हमारे भरोसेमंद डीबगर का उपयोग कर सकते हैं।

debugonce(dplyr:::mutate_impl) 
# Inside of mutate_impl we do: 
class(dots[[2]]$expr) # which is a "call"! 

तो अब हम हमारे lazy expression के प्रकार पता है। हम eval कॉल और notice यह supported type है (दुर्भाग्यवश, आर के TYPEOF मैक्रो दावों factors are integers - हमें Rf_isFactor भेदभाव करने की आवश्यकता होगी)।

तो आगे क्या होता है? हम returned the result और हम कर रहे हैं। यदि आपने पहले ही (df %>% mutate(y="A", z=factor(c("A","B"))))[[3]] को आजमाया है, तो आप जान लेंगे कि समस्या वास्तव में रीसाइक्लिंग है।

Specifically, सी ++ Gatherer object (जो INTSXP रों पर अपनी आज की तारीख की जांच के अलावा Rf_isFactor के लिए जाँच की जा should really) force a Vector<INTSXP> को C++ उपयोग कर रहा है templating बनाया जाना (परोक्ष निर्माता आरंभीकरण के माध्यम से - नोटिस ConstantGathererImpl में arity 2 कॉल) कारक "लेबल" को ले जाने के बिना याद किए बिना।

टीएलडीआर: आर के सी ++ में, TYPEOF मैक्रो का उपयोग करते समय पूर्णांक और कारकों का एक ही आंतरिक प्रकार होता है, और कारक अजीब एज केस होते हैं।

dplyr को पुल अनुरोध सबमिट करने के लिए स्वतंत्र महसूस करें, यह सक्रिय विकास में है और हैडली और रोमेन अच्छे लोग हैं। आपको एक कथन here जोड़ना होगा।

+0

धन्यवाद @Robert Krzyzanowski। मुझे सी ++ कोड के साथ गड़बड़ शुरू करने की हिम्मत नहीं है, लेकिन मैंने इसे गिटूब पर एक मुद्दा के रूप में जोड़ा है: https://github.com/hadley/dplyr/issues/715 –

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