2014-12-27 5 views
29

बदलने डेटा प्रकार परिवर्तित करने के लिए मैं dplyrकई डेटा प्रकार

dat <- dat %>% mutate(
    fac1 = factor(fac1), fac2 = factor(fac2), fac3 = factor(fac3), 
    dbl1 = as.numeric(dbl1), dbl2 = as.numeric(dbl2), dbl3 = as.numeric(dbl3) 
) 

साथ

l1 <- c("fac1","fac2","fac3") 
l2 <- c("dbl1","dbl2","dbl3") 
dat[,l1] <- lapply(dat[,l1], factor) 
dat[,l2] <- lapply(dat[,l2], as.numeric) 

की तरह कुछ का उपयोग कर सकते वहाँ एक और अधिक सुरुचिपूर्ण (कम) dplyr में रास्ता है dplyr?

THX Christof

उत्तर

33

आप स्तंभ वर्गों को बदलने के लिए mutate_each के मानक मूल्यांकन संस्करण (जो mutate_each_ है) का उपयोग कर सकते हैं: dplyr 0.5 में

dat %>% mutate_each_(funs(factor), l1) %>% mutate_each_(funs(as.numeric), l2) 
+6

इस मामले तुम भी इस्तेमाल कर सकते हैं 'starts_with()' – hadley

+2

अपने सुझाव, @hadley के लिए धन्यवाद किया। तो पहले मामले के लिए जो '%%>% mutate_each (funs (factor), start_with ("fac") होगा)' स्ट्रिंग "fac" से शुरू होने वाले सभी कॉलम को कारक में परिवर्तित करने के लिए। –

+0

@docendodiscimus यह सही है – hadley

21

की ?mutate_each (कम से कम नीचे से) यह उस कार्य की तरह दिखता है, जैसा कि @ डॉकेंडो डिस्किमस के उत्तर में, हटा दिया जाएगा और अधिक लचीला विकल्प mutate_if, mutate_all, और mutate_at के साथ प्रतिस्थापित किया जाएगा। @ हडली ने अपनी टिप्पणी में उल्लेख किया है कि सबसे अधिक संभवतः mutate_at का उपयोग कर रहा है। ध्यान दें कि mutate_each की तुलना में तर्कों का क्रम उलट दिया गया है, और vars()select() का उपयोग अर्थशास्त्र की तरह करता है, जिसे मैं ?select_helpers फ़ंक्शंस का अर्थ समझता हूं।

dat %>% mutate_at(vars(starts_with("fac")),funs(factor)) %>% 
    mutate_at(vars(starts_with("dbl")),funs(as.numeric)) 

लेकिन mutate_at स्तंभ के बजाय संख्या एक vars() तर्क ले जा सकते हैं, और इस पेज के माध्यम से पढ़ने, और विकल्प देखने के बाद, मैं mutate_at लेकिन grep के साथ प्रयोग कर एक बार में स्तंभ नाम के कई अलग अलग प्रकार पर कब्जा करने के समाप्त हो गया (जब तक आप हमेशा इस तरह के स्पष्ट कॉलम नाम!)

dat %>% mutate_at(grep("^(fac|fctr|fckr)",colnames(.)),funs(factor)) %>% 
    mutate_at(grep("^(dbl|num|qty)",colnames(.)),funs(as.numeric)) 

मैं mutate_at + grep पता लगाना के बारे में बहुत उत्साहित थी, क्योंकि अब एक पंक्ति बहुत से पर काम कर सकते कॉलम।

संपादित करें - अब मैं select12helpers में से matches() देखता हूं, जो रेगेक्स को संभालता है, इसलिए अब मुझे यह पसंद है।

dat %>% mutate_at(vars(matches("fac|fctr|fckr")),funs(factor)) %>% 
    mutate_at(vars(matches("dbl|num|qty")),funs(as.numeric)) 

एक अन्य आम तौर पर संबंधित टिप्पणी - यदि आपके पास मिलान करने वाले नामों और लगातार प्रारूपों के साथ आपके सभी दिनांक कॉलम हैं, तो यह शक्तिशाली है। मेरे मामले में, यह मेरे सभी YYYYMMDD कॉलम को बदल देता है, जो संख्याओं के रूप में, तारीखों में पढ़े गए थे।

mutate_at(vars(matches("_DT$")),funs(as.Date(as.character(.),format="%Y%m%d"))) 
3

स्तंभ प्रकार परिवर्तन को प्राप्त करने का एक अधिक सामान्य तरीका इस प्रकार है:

आप चरित्र कॉलम, जैसे करने के लिए सभी अपने कारक स्तंभों को बदलने के लिए चाहते हैं, यह एक पाइप का उपयोग किया जा सकता है :

df %>% mutate_each_(funs(as.character(.)), names(.[,sapply(., is.factor)])) 
+12

इस मामले के लिए,' df%>% mutate_if (is.factor, as.character) 'काम करता है (dplyr> 0.5 के संस्करण के लिए) –

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