2013-10-23 14 views
21

से rbind()/cbind() रूपांतरण से बचें, मैं इसे प्लॉट करने से पहले एक डेटासेट बनाने की कोशिश कर रहा हूं। मैं समारोह कारखाने gammaplot.ff() उपयोग करने का फैसला और मेरे कोड के पहले संस्करण इस प्रकार है:संख्यात्मक से कारक

PowerUtility1d <- function(x, delta = 4) { 
    return(((x+1)^(1 - delta))/(1 - delta)) 
} 
PowerUtility1d <- Vectorize(PowerUtility1d, "x") 

# function factory allows multiparametrization of PowerUtility1d() 
gammaplot.ff <- function(type, gamma) { 
    ff <- switch(type, 
       original = function(x) PowerUtility1d(x/10, gamma), 
       pnorm_wrong = function(x) PowerUtility1d(2*pnorm(x)-1, gamma), 
       pnorm_right = function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma) 
      ) 
    ff 
} 

gammaplot.df <- data.frame(type=numeric(), gamma=numeric(), 
          x=numeric(), y=numeric()) 
gammaplot.gamma <- c(1.1, 1.3, 1.5, 2:7) 
gammaplot.pts <- (-1e4:1e4)/1e3 

# building the data set 
for (gm in gammaplot.gamma) { 
    for (tp in c("original", "pnorm_wrong", "pnorm_right")) { 
    fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)  
    dataChunk <- cbind(tp, gm, gammaplot.pts, fpts) 
    colnames(dataChunk) <- names(gammaplot.df) 
    gammaplot.df <- rbind(gammaplot.df, dataChunk) 
    } 
} 

# rbind()/cbind() cast all data to character, but x and y are numeric 
gammaplot.df$x <- as.numeric(as.character(gammaplot.df$x)) 
gammaplot.df$y <- as.numeric(as.character(gammaplot.df$y)) 

बाहर कर देता है, पूरे डेटा फ्रेम चरित्र डेटा होता है, तो मैं इसे वापस मैन्युअल रूप से परिवर्तित करने के लिए है (मेरे लिए कुछ समय लिया पहली जगह में खोजें!)। तो खोज indicates यह ऐसा होता है क्योंकि टाइप चर वर्ण है। से बचने के लिए इस (! आप डेटा सेट के निर्माण, जबकि चरित्र डेटा पर प्रदर्शन के मुद्दों कल्पना कर सकते हैं) मैं कोड कुछ बदल:

gammaplot.ff <- function(type, gamma) { 
    ff <- switch(type, 
       function(x) PowerUtility1d(x/10, gamma), 
       function(x) PowerUtility1d(2*pnorm(x)-1, gamma), 
       function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma) 
      ) 
    ff 
} 

for (gm in gammaplot.gamma) { 
    for (tp in 1:3) { 
    fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)  
    dataChunk <- cbind(tp, gm, gammaplot.pts, fpts) 
    colnames(dataChunk) <- names(gammaplot.df) 
    gammaplot.df <- rbind(gammaplot.df, dataChunk) 
    } 
} 

यह मेरे लिए ठीक काम करता है, लेकिन मैं एक आत्म व्याख्यात्मक चरित्र पैरामीटर, खो दिया है जो एक नकारात्मक पक्ष है। क्या फ़ंक्शन फैक्ट्री का पहला संस्करण चरित्र के सभी डेटा के अंतर्निहित रूपांतरण के बिना रखने का कोई तरीका है?

यदि एक ही परिणाम प्राप्त करने का एक और तरीका है, तो मुझे इसे आजमाने में खुशी होगी।

+0

@ थॉमस, आपका संक्षिप्त उत्तर स्पष्ट रूप से गलत है; स्वीकृत उत्तर देखें। साथ ही, यह बताते हुए कि आपको बिना किसी विकल्प के कुछ करना चाहिए रचनात्मक नहीं है। –

उत्तर

48

आप rbind.data.frame और cbind.data.framerbind और cbind के बजाय का उपयोग कर सकते हैं।

+0

केवल 'cbind.data.frame' का उपयोग करने के लिए पर्याप्त है, क्योंकि' rbind' सही ढंग से काम करता है (डेटा फ्रेम को इसके तर्कों में से एक के रूप में हटा रहा है)। कभी सोचा नहीं कि यह इतना आसान होगा! – tonytonov

+2

सावधान रहें: नाम सूची के साथ संयोजन में 'cbind.data.frame()' का उपयोग करते समय, आप एक एन एक्स एम मैट्रिक्स बनाएंगे, जिसका इरादा नहीं था। यदि, इसका उद्देश्य इरादा नहीं है, तो 'cbind.data.frame()' 'cbind()' के बजाय 'cbind.data.frame()' का उपयोग करने से पहले नामांकित सूची 'अनलिस्ट()' करें। – BurninLeo

+6

'cbind.data.frame (टीपी, जीएम, gammaplot.pts, fpts, स्ट्रिंग्सएफ़ैक्टर्स = गलत)' यदि आपके पास स्ट्रिंग नहीं है AFFactors = F आपके पास अभी भी कारक हो सकते हैं। – mtelesha

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