2015-07-06 6 views
9

मेरे पास एक सूची है (आर में) जहां तत्व अलग-अलग डेटा प्रकार हैं, उदाहरण के लिए, पहला तत्व संख्यात्मक है और दूसरा तत्व वर्ण है। मैं प्रत्येक तत्व को एक अलग समारोह लागू करना चाहता हूं। उदाहरण के लिए, नीचे दिए गए कोड में मैं केवल पहले तत्व में योग फ़ंक्शन को लागू करने का प्रयास करता हूं और लंबाई केवल दूसरे तत्व के लिए कार्य करता हूं। क्या सूची के प्रत्येक तत्व (सूची को तोड़ने के बिना) पर एक अलग फ़ंक्शन लागू करने का कोई तरीका है?आर सूची के प्रत्येक तत्व के लिए lapply अलग फ़ंक्शन

data <- list(
    A = rnorm(10), 
    B = letters[1:10] 
) 

lapply(data, list(sum, length)) 

mapply(function(x) sum, length, data) 

उत्तर

16

के बारे में
mapply(function(a,b) b(a), data, list(sum, length)) 

सूचना है कि हम साथ ही साथ एक सूची में mapply में कार्यों डाल कैसे।

+0

आप कर सकते थे 'do.call' के साथ कुछ ऐसा करें, लेकिन आपको सूचियों की सूची होने के लिए थोड़ा 'डेटा' समायोजित करना होगा। – joran

+0

... दिलचस्प बात यह है कि (तर्क को रीसायकल करने की आवश्यकता को अनदेखा करना) बस 'फॉर लूप' लिखना जो प्रत्येक कार्य को बदले में ~ 5x गुना तेज करता है। – joran

+0

लूप के लिए अच्छी तरह से लिखा गया है आमतौर पर मेरे अनुभव में तेज़ होते हैं, हालांकि आमतौर पर गति इतनी बड़ी नहीं होती है। – MrFlick

6

मैं

sapply(data, function(x) (if(is.character(x)) length else sum)(x)) 

जटिल विकल्प की तरह कुछ करना होगा। गति चिंता का विषय है, तो vapply तेजी से किया जाना चाहिए:

vapply(data, function(x) (if(is.character(x)) length else sum)(x), numeric(1)) 

आप length कई बार उपयोग करने की आवश्यकता है, यह lengths उपयोग करने के लिए तेज है (आर में उपलब्ध 3.2.0+):

res   <- lengths(data) 
get_sum  <- !sapply(data,is.character) 
res[get_sum] <- sapply(data[get_sum],sum) 
संबंधित मुद्दे