2015-06-20 18 views
7

में पूरे मेज पर एक समारोह के रूप में लागू करने के लिएकैसे एक dplyr श्रृंखला

myResults <- rawData %>% filter(stuff) %>% mutate(stuff) 

इस प्रकार मैं एक dplyr श्रृंखला अब मैं myResults करने के लिए एक समारोह myFunc लागू करना चाहते हैं। वहाँ ऐसा करने के लिए है कि श्रृंखला में एक रास्ता है या मैं मूल रूप से करने की आवश्यकता है:

myResults <- myFunc(myResult) 

उत्तर

5

समारोह पहली बार एक तर्क के रूप में एक dataframe लेता है, तो आप सरल यह अंत में जोड़ सकते हैं।

> inc <- function(x) x + 1 
> 1 %>% inc(.) %>% sqrt(.) %>% log(.) 
[1] 0.3465736 

और कुछ उपयोगी magrittr उपनाम के साथ:

library(magrittr) 
set.seed(1) 
inTrain <- sample(1:nrow(mtcars), 20) 
mtcarsTest <- mtcars %>% extract(-inTrain,) 

summaryPipe <- function(x) {print(summary(x)); x} 

mtcars %>% 
    extract(inTrain,) %>% 
    # Train lm 
    lm(mpg ~ ., .) %>% 
    # Print summary and forward lm results 
    summaryPipe %>% 
    # Predict on the test set 
    predict(newdata = mtcarsTest) %>% 
    # Print results and forward arguments 
    print %>% 
    # Compute RMSE 
    subtract(mtcarsTest %>% extract2('mpg')) %>% 
    raise_to_power(2) %>% 
    mean %>% 
    sqrt 

> myFunc <- function(x) sapply(x, max) 
> mtcars %>% filter(mpg > 20) %>% myFunc() 
    mpg  cyl disp  hp drat  wt qsec  vs  am gear 
33.900 6.000 258.000 113.000 4.930 3.215 22.900 1.000 1.000 5.000 
    carb 
    4.000 

यह लायक उल्लेख नहीं है कि magrittr::%>% जो किसी भी तर्क के साथ dplyr काम करता है के द्वारा प्रयोग किया जाता है ताकि आप आसानी से कुछ इस तरह कर सकते हैं

शायद यह स्वाद का विषय है लेकिन व्यक्तिगत रूप से मुझे यह उपयोगी लगता है।

टिप्पणियों में उल्लिखित @ बॉन्डडडस्ट के रूप में %>% पर फ़ंक्शन पास करने के तीन संभावित तरीके हैं। डॉट प्लेसहोल्डर के साथ आप पहले की तुलना में एक अलग स्थिति पर एलएचएस का उपयोग कर सकते हैं (lm कॉल देखें)।

+2

गुजर का एक सबसेट लागू करने के लिए मैं कितना नहीं जानता कि यह इस मामले में मायने रखता है, लेकिन उस उदाहरण समारोह के शरीर में 'लागू' कॉल के बजाय 'लापली (एक्स, अधिकतम)' का उपयोग करना अधिक कुशल हो सकता है। यदि आपने '%>% myFunc (।)' या केवल '%>% myFunc' के साथ किया है तो यह बेहतर दिखाई दे सकता है। मेरी आंखों के लिए, एक खाली तर्क सूची को देखते हुए पता चलता है कि कुछ भी संसाधित नहीं किया जा रहा है, लेकिन शायद यह सिर्फ एक सौंदर्य क्विबल –

+0

'लागू' आउटपुट कॉपी और पेस्ट करना आसान है, लेकिन निश्चित रूप से आप सही हैं। – zero323

+0

ठीक है, तो यदि आप वेक्टर परिणाम चाहते हैं तो 'sapply' का उपयोग करें। आर के शुरुआती उपयोगकर्ता हमेशा 'लागू' के लिए पहले ही पहुंच रहे हैं, और उन्हें या तो चेतावनी दी जानी चाहिए कि अक्सर अनचाहे परिणाम होते हैं –

1

आप मौजूदा कार्यों का उपयोग कर सकते हैं summarise_each या mutate_each सभी स्तंभों या select करने के लिए कॉलम

library(dplyr) 
    mtcars %>% 
    filter(mpg > 20) %>% 
    summarise_each(funs(max)) 
    # mpg cyl disp hp drat wt qsec vs am gear carb 
    #1 33.9 6 258 113 4.93 3.215 22.9 1 1 5 4 

या एक बाहरी समारोह

myFunc1 <- function(x) max(x) 
    mtcars %>% 
    filter(mpg > 20) %>% 
    summarise_each(funs(myFunc1)) 
# mpg cyl disp hp drat wt qsec vs am gear carb 
#1 33.9 6 258 113 4.93 3.215 22.9 1 1 5 4