2013-02-06 21 views
7

की एक सूची के लिए एक data.frame परिवर्तित मैं कैसे सूचियों की एक सूचीसूचियों

LoL <- list(list(id="af1", start=100, end=114), list(id="af2", start=115, end=121)) 

मैं

not.LoL <- as.list(as.data.frame(t(df))) 
तरह बातें की कोशिश की है करने के लिए एक data.frame

df <- data.frame(id=c("af1", "af2"), start=c(100, 115), end=c(114,121)) 

परिवर्तित कर सकते हैं

और मुझे सच में यकीन नहीं है कि इसके बाद मैं क्या कर रहा हूं, लेकिन यह बिल्कुल सही नहीं है। मेरे आवश्यकता है कि मैं उपयोग कर सकते हैं, कहते हैं, आदेश द्वारा पहले start है

> LoL[[1]]$start 
[1] 100 

not.LoL कि मैं वर्तमान में है मुझे निम्न त्रुटि देता है:

> not.LoL[[1]]$start 
Error in not.LoL[[1]]$start : $ operator is invalid for atomic vectors 

स्पष्टीकरण और/या समाधान बहुत होगा की सराहना की।

संपादित करें: मुझे यह स्पष्ट करना चाहिए था कि "आईडी" वास्तव में गैर-अद्वितीय है - एक आईडी के तहत कई तत्व हो सकते हैं। तो मैं ऐसे समाधान के साथ कर सकता हूं जो अद्वितीय आईडी पर split पर निर्भर नहीं है।

+0

[सूचियों की सूची में रीशेप मैट्रिक्स का संभावित डुप्लिकेट] (http://stackoverflow.com/questions/9195112/reshape-matrix-into-a-list-of-lists) – agstudy

+1

@agstudy: डुप्लिकेट नहीं: वह एक ragged arrays और 'tapply' के बारे में है, जबकि यह यहां आयताकार प्रतीत होता है और इसलिए नीचे दिखाए गए अनुसार 'lapply' का उपयोग करके हल किया जा सकता है) (http://stackoverflow.com/a/14730102/1468366)। – MvG

+1

@ एमवीजी संख्या। पहला समाधान देखें, वह 2 समाधान प्रस्तावित करता है, एक 'लापली' वाला है जो स्पष्ट रूप से यहां प्रस्तावित एक ही समाधान है। और मेरा जवाब यहां मेरी तरह dlply का उपयोग कर। – agstudy

उत्तर

7

plyr का उपयोग करना, आप कर सकते हैं इस

dlply(df,.(id),c) 

, आईडी द्वारा समूहीकरण एक से अधिक कर रहे हैं से बचने के लिए (शायद आपको कॉलम नाम बदलने की जरूरत है, आईडी मेरे लिए अद्वितीय है)

dlply(df,1,c) 
+0

क्षमा करें, उस कॉलम के लिए 'id' का उपयोग भ्रमित कर रहा है। 'प्लीयर' समाधान के लिए धन्यवाद! – MattLBeck

+0

+1 मुझे लगता है कि 'प्लीर' यहां अल्पसंख्यक के लिए जीतता है! –

+0

@agstudy किसी समस्या में दूसरे समाधान का उपयोग करने के बाद जब आईडी अद्वितीय नहीं थी, तो मैंने पाया कि समाधान वास्तव में पहले कॉलम द्वारा समूहित होगा। क्या मुझसे कोई चूक हो रही है? – MattLBeck

5
LMAo <- lapply(split(df,df$id), function(x) as.list(x)) # is one way 

# more succinctly 
# LMAo <- lapply(split(df,df$id), as.list) 

अपनी टिप्पणी के अनुसार एक संपादित समाधान:

lapply(split(df,seq_along(df[,1])), as.list) 
+0

यह बहुत अच्छा है और इस समय मेरे उद्देश्यों के लिए काम करता है। हालांकि, जैसे @ एमवीजी ने कहा कि यह आईडी द्वारा समूहित है, और मुझे वास्तव में आवश्यकता नहीं है कि आईडी अद्वितीय हैं। क्या इसके चारों ओर एक रास्ता है? – MattLBeck

+0

@ मैट्र्रिशन मैं अपना समाधान अपडेट करता हूं। – agstudy

+0

डाउनवोट कर सकते हैं, बताएं कि मैंने जो किया है उसके साथ क्या गलत है, और थोड़ा अयस्क रचनात्मक हो? –

4

आप इस तरह सूचियों की एक सूची में अपने डेटा फ्रेम चालू करने के लिए apply उपयोग कर सकते हैं:

LoL <- apply(df,1,as.list) 

बहरहाल, यह, पाठ करने के लिए अपने सभी डेटा बदल जाएगा के रूप में यह कार्य करने के लिए एकल परमाणु वेक्टर गुजरता ।

+0

यदि आपके पास डेटा.फ्रेम में संख्यात्मक/चरित्र/कारक हैं और LoL के लिए @Andrie * "ड्रेगन" * –

+0

+1 के शब्दों में है (सूची परिवर्तनीय नाम की सूची की सूची) – agstudy

+0

यह कष्टप्रद है कि केवल चरित्र डेटा रिटर्न लागू करता है। अन्यथा मैं इस समाधान की सादगी से प्यार करता हूँ! – MattLBeck

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