2013-01-15 23 views
5

मैं मूल्यों की एक सूची पर apply के कुछ स्वाद का उपयोग करके और प्रत्येक मान के लिए एकल-पंक्ति डेटा फ्रेम लौटाकर, एक पंक्ति से डेटाफ्रेम पंक्ति उत्पन्न करना चाहता हूं। एक खिलौना उदाहरण के रूप में, मान लीजिए कि मेरी मूल्यों i = 1:3 कर रहे हैं और मेरे पास है:पंक्ति द्वारा डेटा फ्रेम पंक्ति उत्पन्न करने के लिए आवेदन कैसे करें?

f <- function(i) { 
    return(data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F)) 
} 

मैं sapply, lapply, कोई सफलता के साथ पक्षांतरित आदि का एक समूह (उदाहरण के लिए, d = sapply(1:3, f) होनहार लग रहा है के साथ चारों ओर खिलवाड़ किया गया है , लेकिन मुझे जो चाहिए वह ट्रांसपोज़र प्रतीत होता है, इसलिए मैंने d = t(sapply(1:3,f)) को आजमाया, सिवाय इसके कि यह एक मैट्रिक्स है; इसलिए मैंने अगले d = as.data.frame(t(sapply(1:3, f))) को आजमाया, जो सही दिखाई देता है (यह केवल वही है जो मुझे चाहिए), लेकिन अभी भी गलत है , जैसा कि आप यह पता लगाएंगे कि क्या आप इसे सब्सक्राइब करने का प्रयास करते हैं जैसे d[,1] जो वास्तव में एक सूची है)।

अंत में मैं यह मिल गया है, जो काम करता है:

d = apply(data.frame(i=1:3), 2, f)$i 

जो मुझे फ्रेम मैं चाहता था देता है:

img cached i 
1 a FALSE 1 
2 b FALSE 2 
3 c FALSE 3 

वहाँ एक बेहतर/क्लीनर ऊपर व्यक्त करने के लिए रास्ता नहीं है? यह सब बहुत प्यारा लगता है और मुझे बहुत जटिल है।


संपादित: के रूप में कई पाठकों द्वारा उल्लेख किया है, यह "खिलौना उदाहरण" admitedly बहुत आसान है, और वास्तव में सिर्फ f(1:3) यह क्या लगता है जैसे मैं विनती करता हूँ करना होगा। वास्तविक कार्य एक वेब-आधारित मीट्रिक डैशबोर्ड का हिस्सा है, विभिन्न डीबी तालिकाओं से डेटा खींचता है, और सामान्य रूप से जटिल प्लॉट बनाता है जिसे मैं कैश करना चाहता हूं (अधिकांश समय वे अपेक्षाकृत धीरे-धीरे बदलते हैं)। मुझे लगता है कि प्रासंगिक भाग यह है कि फ़ंक्शन आमतौर पर कई तर्क लेता है, और वे तर्क एक साधारण अनुक्रम 1:n नहीं हैं।

library(digest) 
gkey <- function(...) { 
    args <- list(...) 
    return(digest(paste(args,sep=".",collapse="."))); 
} 

f <- function(conn, table, checknew.query, plot.query, plot.fun, params) { 
    latest.data = queryExec(conn, table, checknew.query, params) 
    key = gkey(table, latest.data, plot.query, plot.fun, params) 
    out = getFromCacheOrPlot(key, conn, table, plot.query, plot.fun, params) 
    return(out) 
} 

जहां queryExec एक प्रश्न बनाता है, यह निष्पादित करता है और परिणाम प्राप्त करता है, gkey() अपने मापदंडों के आधार पर एक हैश कुंजी गणना करता है, getFromCacheOrPlot()key का उपयोग करता है के निर्माण के लिए: तो, मुझे उदाहरण को फिर से लिखने और अधिक यथार्थवादी एक बालक होने के लिए जाने एक फ़ाइल नाम (एक .png छवि), यदि यह मौजूद है, तो इसे कैश से पुनर्प्राप्त करता है, या अन्यथा उत्पन्न करता है। यह एक पंक्ति के साथ डेटा.फ्रेम भी देता है जो हमें फ़ाइल नाम देता है, एक एचटीएमएल <img=...> इसे प्रदर्शित करने के लिए अस्पष्टता, चाहे साजिश कैश में या बाहर थी, और साजिश के लिए कौन से पैरामीटर का उपयोग किया गया था।

यह सब विकी सिस्टम के लिए प्लगइन में उपयोग किया जाता है, और कुछ पृष्ठों में दर्जनों भूखंड या अधिक होते हैं।

+3

'करो। कॉल (rbind, lapply (i, f)) 'वह करेगा जो आप पूछ रहे हैं ... लेकिन ऐसा होगा' data.frame (img = अक्षर [i], कैश्ड = एफ, i = i, स्ट्रिंग्सएफ़ैक्टर्स = एफ) ' ... तो मुझे लगता है कि मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। – Justin

+0

मुझे लगता है कि आपको एक खिलौना उदाहरण की आवश्यकता है जो आपके वास्तविक मुद्दे का अधिक सटीक रूप से प्रतिनिधित्व करता है, क्योंकि मेरी तत्काल प्रतिक्रिया केवल 'data.frame (img = अक्षर [i], cached = rep (गलत, लंबाई (i)) करने के लिए होगी, i = i) 'और मैं अनुमान लगा रहा हूं कि आप इसके बाद क्या नहीं कर रहे हैं। – joran

+0

या, चूंकि आपने पहले ही फ़ंक्शन 'f' बना दिया है: 'f (i)' डेटा.फ्रेम भी उत्पन्न करेगा। – Justin

उत्तर

8

do.call(rbind, lapply(i, f)) के किसी भी स्वाद का उपयोग करने के लिए कोई ज़रूरत नहीं है कि तुम क्या पूछ रहे हैं क्या करेंगे ... लेकिन इतना होगा:

data.frame(img=letters[i], cached=F, i=i, stringsAsFactors=F) 

होगा के रूप में:

f(i) 
+4

या 'plyr :: ldply (i, f) ' – hadley

+0

का उपयोग करें, मैं भी हैडली, क्योंकि मैं पहले से ही प्लीयर और ggplot का उपयोग कर रहा हूं जो पूरे प्लॉट का उत्पादन करता है ... –

+0

बेहद सहायक और सुरुचिपूर्ण –

3

इसके बारे में क्या? apply कार्यों

foo <- function(x){ 
    i <- seq_len(x) 
    data.frame(img=letters[i], cached=FALSE, i=i, stringsAsFactors=F) 
} 


    foo(5) 
    img cached i 
1 a FALSE 1 
2 b FALSE 2 
3 c FALSE 3 
4 d FALSE 4 
5 e FALSE 5 
+0

क्षमा करें, लेकिन यह मेरे बाद नहीं है। जैसा कि ऊपर मेरी टिप्पणियों में इंगित किया गया है, खिलौना उदाहरण बहुत आसान है; मैं अपने प्रश्न को दोहरा दूंगा। –

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

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