2014-05-20 4 views
10

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

मैं modelset[[1]]$likelihood & modelset[[1]]$fixef, modelset[[2]]$likelihood & modelset[[2]]$fixef निकालने, आदि, और एक डेटा फ्रेम में परिणामों को जोड़ करना चाहते हैं।

क्या कोई मुझे यह कैसे करने का विचार दे सकता है?

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

अधिक जानकारी:

modelset: Large list (16 elements, 7.3Mb) 
    :List of 29 
    ..$ fixef   : Named num [1:2] -1.236 -0.611 
    .. ..- attr(*, "names")= chr [1:2] "(Intercept)" "SMIstd" 
    ..$ likelihood  :List of 4 
    .. ..$ hlik: num 238 
    .. ..$ pvh : num 256 
    .. ..$ pbvh: num 260 
    .. ..$ cAIC: num 567 

    ...etc 
+1

'लापली (मॉडलसेट," [["," संभावना ")' आदि ... –

उत्तर

29

इस सुंदर ढंग से हल करने के लिए आप को समझने के लिए कि आप सूची तत्वों का उपयोग करने के $… के बजाय ['…'] उपयोग कर सकते हैं (लेकिन आप एक सूची वापस बजाय एक के मिल जाएगा की जरूरत है आदेश में व्यक्तिगत तत्व)।

तो तुम तत्वों likelihood और fixef प्राप्त करना चाहते हैं, तो आप लिख सकते हैं:

modelset[[1]][c('likelihood', 'fixef')] 

अब आपको बस इतना करना है कि modelset में प्रत्येक तत्व के लिए चाहते हैं। यही कारण है कि lapply करता है:

lapply(modelset, function (x) x[c('likelihood', 'fixef')]) 

यह काम करता है, लेकिन यह बहुत आर की तरह नहीं है।

आप आर में देखते हैं, लगभग सबकुछ एक कार्य है। […][ नामक फ़ंक्शन को कॉल कर रहा है (लेकिन [ आर के लिए एक विशेष प्रतीक है, बैकटिक्स में उद्धृत करने की आवश्यकता में: `[`)। तो आप इसके बजाय इसे लिख सकते हैं:

lapply(modelset, function (x) `[`(c('likelihood', 'fixef')]) 

वाह, यह बिल्कुल भी पठनीय नहीं है। हालांकि, अब हम, रैपिंग गुमनाम function (x) निकाल सकते हैं अंदर से हम सिर्फ एक और समारोह कॉल कर रहे हैं, और lapply के अंतिम पैरामीटर के लिए अतिरिक्त तर्क के लिए कदम:

lapply(modelset, `[`, c('likelihood', 'fixef')) 

यह काम करता है और सुरुचिपूर्ण आर कोड है।


चलो वापस कदम उठाएं और हमने जो किया है उसकी पुनः जांच करें। वास्तव में, हम एक अभिव्यक्ति है जो इस तरह दिख रही थी:

lapply(some_list, function (x) f(x, y)) 

और यह कॉल के बजाय, के रूप में

lapply(some_list, f, y) 

हम वास्तव में ऐसा ही किया लिखा जा सकता है somelist = modelset, f = `[` और y = c('likelihood', 'fixef') साथ।

+3

इस तरह के इस तरह के कट्टरपंथी उत्तर को ढूंढना आसान नहीं है। धन्यवाद। –

+0

आपके बहुत ही उपयोगी उत्तर और स्पष्टीकरण के लिए धन्यवाद। – Akos

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