2015-02-18 8 views
8

मैं नए पैकेज का उपयोग कर रहा हूं, dplyr और कुछ कठिनाइयों का सामना कर रहा हूं।आर dplyr में उत्परिवर्तित/परिवर्तन (पास कस्टम फ़ंक्शन)

mutate(df,isOdd=digit%%2) or transform(df,isOdd=digit%%2) 

दोनों जो पूरी तरह से काम करते हैं।

मैं कस्टम विधि पारित करने पर एक प्रश्न पूछ रहा हूं।

IsItOdd <- function(x) { 
    if(x%%2==0) 
    result<-"even" 
    else 
    result<-"odd" 
    return(result) 
} 

transform(df,isOdd=IsItOdd(digit)) 

यह काम नहीं करता है क्योंकि सभी अंकों का पूरा कॉलम फ़ंक्शन पर पास हो जाता है। क्या इस काम को पूरे कॉलम के बजाए फ़ंक्शन में बस एक सेल से गुजरने का कोई तरीका है?

+2

'बदलने (df, isOdd = vapply (अंकों, IsItOdd," "))' या 'बदलने (, आईएसओ dd = vectorize (IsItOdd) (अंक)) '? – lukeA

उत्तर

9

आपके फ़ंक्शन को बदलने के साथ वेक्टर पर काम करना है। आप ifelse बजाय जो वैक्टर पर काम करता है का उपयोग कर सकते:

isOdd <- function(x){ ifelse(x %% 2 == 0, "even", "odd") } 

वैकल्पिक रूप से आप समारोह हर मूल्य के लिए कॉलम में apply कार्यों में से एक के साथ आवेदन कर सकते हैं:

isOdd <- function(x){ 
    sapply(x, function(x){ 
      if(x %% 2 == 0){ 
       return("even") 
      }else{ 
       return("odd") 
      } 
    })} 
6

मुझे लगता है कि आप भी इस्तेमाल कर सकते हैं group_by() अनन्य मानों द्वारा पंक्तियों के अलावा चिढ़ाने और बाद में अपने गणना, इसलिए की तरह करने के लिए: df

df %>% group_by(digit) %>% mutate(isOdd = IsItOdd(digit)) 
संबंधित मुद्दे