2012-05-14 6 views
14

मैं कुछ आर कोड है जो मौजूदा निर्देशिका में सभी फ़ाइलों पर कुछ डेटा निष्कर्षण कार्रवाई निष्पादित करता है करने के लिए lapply से आउटपुट निकाला जा रहा है, निम्नलिखित कोड का उपयोग कर:एक dataframe

files <- list.files(".", pattern="*.tts") 
results <- lapply(files, data_for_time, "17/06/2006 12:00:00") 

lapply से उत्पादन होता है निम्नलिखित (निकाले dput() का प्रयोग करके) - मूल रूप से वैक्टर से भरा एक सूची:

list(c("amer", "14.5"), c("appl", "14.2"), c("brec", "13.1"), 
c("camb", "13.5"), c("camo", "30.1"), c("cari", "13.8"), 
c("chio", "21.1"), c("dung", "9.4"), c("east", "11.8"), c("exmo", 
"12.1"), c("farb", "14.7"), c("hard", "15.6"), c("herm", 
"24.3"), c("hero", "13.3"), c("hert", "11.8"), c("hung", 
"26"), c("lizr", "14"), c("maid", "30.4"), c("mart", "8.8" 
), c("newb", "14.7"), c("newl", "14.3"), c("oxfr", "13.9" 
), c("padt", "10.3"), c("pbil", "13.6"), c("pmtg", "11.1" 
), c("pmth", "11.7"), c("pool", "14.6"), c("prae", "11.9" 
), c("ral2", "12.2"), c("sano", "15.3"), c("scil", "36.2" 
), c("sham", "12.9"), c("stra", "30.9"), c("stro", "14.7" 
), c("taut", "13.7"), c("tedd", "22.3"), c("wari", "12.7" 
), c("weiw", "13.6"), c("weyb", "8.4")) 

हालांकि, मैं होता तो दो कॉलम के साथ एक dataframe के रूप में इस उत्पादन से निपटने के लिए की तरह है: वर्णमाला कोड के लिए एक ("amer", "appl" आदि) और के लिए एक टी वह संख्या (14.5, 14.2 आदि)।

दुर्भाग्यवश, as.data.frame किसी सूची के अंदर नेस्टेड वैक्टरों के इस इनपुट के साथ काम नहीं कर रहा है। मुझे इसे बदलने के बारे में कैसे जाना चाहिए? क्या मुझे इस तरीके को बदलने की ज़रूरत है कि मेरा फ़ंक्शन data_for_time इसके मान देता है? फिलहाल यह c(name, value) देता है। या इस तरह के आउटपुट से डेटाफ्रेम में कनवर्ट करने का एक अच्छा तरीका है?

+1

यदि आप का इस्तेमाल किया था '' एक और अधिक "नियमित" वस्तु lapply' आप मिल गया है हो सकता है के बजाय sapply'। –

उत्तर

8

एक विकल्प plyr पैकेज है, जो चीजों को आप के लिए एक डेटा फ्रेम में वापस जोड़ देगा से ldply फ़ंक्शन का उपयोग हो सकता है।

इसके बारे में एक तुच्छ उदाहरण फायदा नहीं है:

ldply(1:10,.fun = function(x){c(runif(1),"a")}) 
        V1 V2 
1 0.406373084755614 a 
2 0.456838687881827 a 
3 0.681300171650946 a 
4 0.294320539338514 a 
5 0.811559669673443 a 
6 0.340881009353325 a 
7 0.134072444401681 a 
8 0.00850683846510947 a 
9 0.326008745934814 a 
10 0.90791508089751 a 

लेकिन ध्यान दें कि यदि आप c() साथ चर प्रकार मिश्रण कर रहे हैं, तो आप शायद बस data.frame(name= name,value = value)c(name,value) के बजाय वापस जाने के लिए अपने कार्य को बदलने के लिए चाहते हैं। अन्यथा सब कुछ चरित्र के लिए मजबूर किया जाएगा (जैसा कि यह ऊपर मेरे उदाहरण में है)।

28

इस प्रयास करें यदि results अपनी सूची थे:

> as.data.frame(do.call(rbind, results)) 

    V1 V2 
1 amer 14.5 
2 appl 14.2 
3 brec 13.1 
4 camb 13.5 
... 
+4

+1 - 'do.call' यहां सुरुचिपूर्ण है। मैं यह भी सिफारिश करता हूं कि OP उचित डेटा और प्रकार के साथ डेटा.फ्रेम वापस करने के लिए अपने 'data_for_time' फ़ंक्शन को संशोधित करता है। इसलिए यहां 'as.data.frame' कॉल को हटाने और जबरदस्ती का जोखिम निकालने के लिए। – flodel

1

क्योंकि और forNelton प्रतिक्रिया मैं देने की प्रक्रिया में था लिया और Joran केवल अन्य उचित प्रतिक्रिया मैं के बारे में सोच सकता है लिया और के बाद से मैं माना जाता रहा हूँ यहाँ एक कागज लिखने के एक हास्यास्पद जवाब है:

#I named your list LIST 
LIST2 <- LIST[[1]] 
lapply(2:length(LIST), function(i) {LIST2 <<- rbind(LIST2, LIST[[i]])}) 
data.frame(LIST2) 
3
inp <- list(c("amer", "14.5"), c("appl", "14.2"), .... # did not see need to copy all 

data.frame(first= sapply(inp, "[", 1), 
      second =as.numeric(sapply(inp, "[", 2))) 

    first second 
1 amer 14.5 
2 appl 14.2 
3 brec 13.1 
4 camb 13.5 
5 camo 30.1 
6 cari 13.8 
snipped output 

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

  • कोई संबंधित समस्या नहीं^_^